1. 引言
在這篇短文中,我們簡要地介紹了Spring MVC中常用的註解 @RequestBody和@ResponseBody。
2. @RequestBody
簡單地說,在@RequestBody註解的幫助下,Spring MVC會自動將HttpRequest body反序列化爲一個Java對象,通常會將HttpRequest body映射到一個DTO或DO。
首先,讓我們看一看Spring控制器方法:
-
@PostMapping("/request")
-
public ResponseEntity postController(
-
@RequestBody LoginForm loginForm) {
-
-
exampleService.fakeAuthenticate(loginForm);
-
return ResponseEntity.ok(HttpStatus.OK);
-
}
如果HttpRequest body攜帶了正確的JSON,Spring MVC會自動將這個JSON反序列化爲一個Java對象。通常情況下,我們必須將使用了@RequestBody標註的Java類與客戶端發送的JSON相對應。
Tips:
bug高發區:Java類中的屬性名與JSON中的鍵名必須完全一樣,不一樣的鍵值對是不會序列化到Java對象中的(⊙o⊙)哦。
-
public class LoginForm {
-
private String username;
-
private String password;
-
// ...
-
}
在這個例子中,我們將HttpRequest body映射到上面的這個LoginForm 對象。
讓我們使用CURL來測試下這個接口:
-
curl -i \
-
-H "Accept: application/json" \
-
-H "Content-Type:application/json" \
-
-X POST --data
-
'{"username": "johnny", "password": "password"}' "https://localhost:8080/.../request"
這就是一個Spring REST API以及使用@RequestBody 註解將Angular客戶端發送的JSON自動序列化成Java對象所需要的全部內容了!
3. @ResponseBody
@ResponseBody註解告訴控制器,返回的對象需要自動序列化成JSON,並通過HttpResponse body返回給客戶端。
Tips:
使用@ResponseBody註解修飾後,這個接口返回的將不是一個頁面。
假設我們有一個自定義的Response對象,如下所示:
-
public class ResponseTransfer {
-
private String text;
-
-
// standard getters/setters
-
}
接下來實現相應的控制器:
-
@Controller
-
@RequestMapping("/post")
-
public class ExamplePostController {
-
-
@Autowired
-
ExampleService exampleService;
-
-
@PostMapping("/response")
-
@ResponseBody
-
public ResponseTransfer postResponseController(
-
@RequestBody LoginForm loginForm) {
-
return new ResponseTransfer("Thanks For Posting!!!");
-
}
-
}
在瀏覽器的開發者控制檯或者使用像Postman這樣的工具,我們可以看到以下的響應:
-
{
-
"text": "Thanks For Posting!!!"
-
}
請記住,如果控制器使用了@RestController註解,就不需要再使用 @ResponseBody了,因爲它已經默認添加的。
Tips:
@RestController是一個組合註解,組合了@Controller和@ResponseBody。
4. 總結
我們已經爲Spring應用構建了一個簡單的Angular客戶端,並演示瞭如何使用@RestController和@ResponseBody註解。
像往常一樣,示例代碼在GitHub上可以找到。