Hỏi về @RequestBody và @ResponseBody trong Spring MVC

e chào anh chị. e đang học về spring mvc. như tiêu đề thì 2 chỗ này e không hiểu lắm. google rồi nhưng thấy ngta trả lời chung chung quá. anh chị có thể giải thích rõ hơn cho e với được không ạ? và cho e ví dụ và giải thích ví dụ luôn được không ạ? e cám ơn

sao chỉ có đến phần header fields thôi v a?

Bạn chỉ cần hiểu thế này:

  • @ResponseBody
    Ví dụ: Giả sử mình muốn lấy thông tin user trả về là 1 chuỗi json string bằng cách request đường dẫn /user/123 với 2 cách sau:
  • Không sử dụng annotation @ResponseBody

      @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
      public String verify(@PathVariable(required = true) String id) {
      	User user = userRepository.getUser(id);
              return JsonUtil.toJsonString(user);
      }
    
  • Sử dụng annotation @ResponseBody

      @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
      public @ResponseBody User verify(@PathVariable(required = true) String id) {
            return userRepository.getUser(id);
       }
    

=> Qua 2 ví dụ ở trên bạn có thể thấy annotation ResponseBody nói cho MVC biết không render một model vào trong view mà phải trả về đối tượng vào trong body. Spring sẽ tự động convert đối tượng này sang JSON sử dụng Jackson 2. Nói đơn giản hơn là annoation ResponseBody sẽ giúp bạn convert đối tượng trả về thành chuỗi json thì vì bạn dùng 1 thư viện nào nó để convert.

  • @RequestBody.
    Ví dụ: Giả sử mình muốn tạo một tài khoản cho user:
    Client dùng ajax gửi yêu cầu tạo tài khoản:
   $.post("/user/register", {
    			username: username,
    			password : password,
    			email : email,
    			phone: phone,
    			birthday: birthday	
    		}, function(data) {
    			var json = JSON.parse(data);
    			//...
    		}

Server:

  • Với cách thông thường bạn sẽ làm như sau:
@PostMapping(value = "/user/register", produces = "application/json;charset=UTF-8")
	public @ResponseBody User register(@RequestParam(value = "username") String username, @RequestParam(value = "password") String password, @RequestParam(value = "email") String email, @RequestParam(value = "phone") String phone, @RequestParam(value = "birthday") String birthday) {
		User user = new User();
        user.setUsername(username);
        //...
        user = userRepository.insert(user);
		return user ;
	}
  • Bạn thấy cách thông thường mình làm quá dài để đơn giản hơn spring có @RequestBody và làm như sau:
@PostMapping(value = "/user/register", produces = "application/json;charset=UTF-8")
	public @ResponseBody User register(@RequestBody User user) {
        user = userRepository.insert(user);
		return user ;
	}

=> Tóm lại khi bạn gửi lên json data annotation RequestBody sẽ nói Spring convert json data đó thành đối tượng user và sử dụng như bình thường.

10 Likes

Request và Response trong giao thức HTTP. Chuẩn HTTP được viết trong tài liệu RFC2616.

Mỗi request và response đều có 2 thành phần: header và body. @ResquestBody tương ứng với phần body của request. @RespondBody tương ứng với phần body của response.

Bạn chỉ cần đọc phần Request và Response là rõ. Nếu muốn đầy đủ thì đọc tất cả các phần liên quan đến giao thức HTTP.

HTTP Request: https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html2
HTTP Response: https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html1

Tồ lô :)).

Em cảm ơn rất rất nhiều. Bài giải thích thật chi tiết cho thằng gà mờ như em đây!

Quá hay bạn. Bạn có nhận gia sư ko nhỉ :slight_smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?