1. 概述
在本教程中,我們將演示如何使用 Spring Boot 構建一個 REST 服務,用於消費和生產 JSON 內容。
我們還將瞭解如何輕鬆地採用 RESTful HTTP 語義。
為了簡化起見,我們不會包含持久化層,但 Spring Data 也能輕鬆地添加。
2. REST 服務
在 Spring Boot 中編寫 JSON REST 服務非常簡單,因為 Jackson 在 classpath 上時,這正是其默認觀點:
@RestController
@RequestMapping("/students")
public class StudentController {
private final StudentService service;
public StudentController(StudentService service) {
this.service = service;
}
@GetMapping("/{id}")
public Student read(@PathVariable(name = "id) String id) {
return service.find(id);
}
...
通過為我們的StudentController註解了@RestController,我們告訴 Spring Boot 將read 方法的返回值寫入響應體。由於我們還具有在類級別上使用@RequestMapping,因此任何我們添加的公共方法都將適用。
雖然簡單,這種方法缺乏 HTTP 語義。例如,如果未找到請求的學生,我們是否希望返回 404 狀態碼而不是 200 或 500 狀態碼?
讓我們看看如何獲得對 HTTP 響應的更多控制,並向我們的控制器添加一些典型的 RESTful 行為。
3. 創建
當我們需要控制響應的各個方面,除了響應體之外,例如狀態碼時,我們可以返回一個 ResponseEntity:
@PostMapping("/")
public ResponseEntity<Student> create(@RequestBody Student student)
throws URISyntaxException {
Student createdStudent = service.create(student);
if (createdStudent == null) {
return ResponseEntity.notFound().build();
} else {
URI uri = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(createdStudent.getId())
.toUri();
return ResponseEntity.created(uri)
.body(createdStudent);
}
}
在這裏,我們不僅返回創建的 Student 對象,而且還會返回一個語義明確的 HTTP 狀態碼,如果創建成功,還會提供指向新資源的 URI。
4. 讀取
正如之前提到的,如果我們想要讀取單個 學生,如果找不到該學生,返回 404 狀態碼更具語義清晰度:
@GetMapping("/{id}")
public ResponseEntity<Student> read(@PathVariable(name = "id") Long id) {
Student foundStudent = service.read(id);
if (foundStudent == null) {
return ResponseEntity.notFound().build();
} else {
return ResponseEntity.ok(foundStudent);
}
}
在這裏,我們可以清楚地看到與我們最初的 read() 實現的不同。
這種方式,Student 對象將被正確地映射到響應體中,並同時返回正確的狀態碼。
5. 更新
更新與創建非常相似,但映射到 PUT 請求,而不是 POST 請求,並且 URI 包含資源的 標識符:
@PutMapping("/{id}")
public ResponseEntity<Student> update(@RequestBody Student student, @PathVariable(name = "id) Long id) {
Student updatedStudent = service.update(id, student);
if (updatedStudent == null) {
return ResponseEntity.notFound().build();
} else {
return ResponseEntity.ok(updatedStudent);
}
}
6. 刪除
刪除操作映射到 DELETE 方法。 URI 還包含資源的 。
@DeleteMapping("/{id}")
public ResponseEntity<Object> deleteStudent(@PathVariable(name = "id") Long id) {
service.delete(id);
return ResponseEntity.noContent().build();
}
我們沒有實現特定的錯誤處理,因為 delete() 方法實際上是通過拋出 Exception 來實現的。
7. 結論
在本文中,我們學習瞭如何在典型的 Spring Boot 開發的 CRUD REST 服務中消費和生產 JSON 內容。此外,我們還演示瞭如何實現適當的響應狀態控制和錯誤處理。
為了保持簡單,我們沒有涉及持久化這一部分,但 Spring Data REST 提供了一種快速高效的方式來構建 RESTful 數據服務。