使用Spring Boot設計和實現REST API
REST端點用於整合應用程式或伺服器端向客戶端提供服務。在本文中,將介紹基於CRUD的SpringBoot來設計和實現REST端點。
假設有一個客戶資料,我將建立一個相應的Spring REST Controller來訪問客戶資料。為了簡單起見,我將只關注控制器類而不是整個spring應用程式。可以在github中下載完整的專案。
這是一個CRUD應用程式,因此控制器將有四種基本方法來支援獲取,儲存,更新和刪除操作。所有這些操作都將適用於客戶資料。下面是控制器類的框架。
@RestController @RequestMapping("/customers") public class CustomerController { @Autowired private CustomerRepository customerRepository; //get, save, update and delete 方法 }
客戶資源的所有端點都以/ customers開頭。
設計和實施端點
端點應簡短易用。例如,為了通過Id獲取客戶,我們可以使用/ customers / {id}這樣的端點。
但是像/ customers / getCustomerById,其URL中含有操作動詞是錯誤的,因為通過Id獲取客戶是一個操作,我們可以使用HTTP方法實現此操作,因此放在URL中是多餘的,它使URL複雜化。
HTTP提供了各種可用於簡化端點的方法。HTTP提供了一些標準方法,如GET,PUT,POST或OPTIONS等。所有這些方法都有助於設計簡單的REST端點,因為這是標準的,所以每個人都可以理解它們。
GET
GET方法用於訪問資源。要根據ID獲取客戶記錄,我們可以使用/ customers / {id}等端點。以下是此終點的實現。
@RequestMapping(value = {"/{id}"}) ResponseEntity byId(@PathVariable String id){ if(!customerRepository.existsById(id)) return new ResponseEntity<>(HttpStatus.NOT_FOUND); // HTTP 404 return new ResponseEntity<>(customerRepository.findById(id).get(), HttpStatus.OK); // HTTP 200 }
當客戶端請求無效或不存在的“id”時,我們可以使用標準HTTP響應程式碼,而不是使用自定義正文或錯誤訊息進行響應。HTTP響應程式碼是REST中用於通知處理狀態的標準方式。有許多類別的程式碼可用,這裡是關於這些程式碼的一些資訊的連結。
- 404 - 未找到:如果資料儲存中沒有“id”,則使用此HTTP程式碼是合適的。請注意,此HTTP程式碼是一個標準程式碼,表示沒有找到任何資料,因此客戶端可以理解這一點,而不會在響應正文中提供任何額外資訊。
- 200 - 確定:已成功處理請求。
POST
此方法用於建立新資料記錄。此請求的端是/ customers。資料作為正文的一部分發送,因此不需要請求引數。
@RequestMapping(value = {""}, method = RequestMethod.POST)
ResponseEntity<?> save(@RequestBody Customer customer){
if(customer == null)
return new ResponseEntity(HttpStatus.BAD_REQUEST); // HTTP 400
if(customerRepository.existsById(customer.getId()))
return new ResponseEntity(HttpStatus.CONFLICT); // HTTP 409
Customer cust = customerRepository.save(customer);
return new ResponseEntity<>(cust, HttpStatus.CREATED); // HTTP 201
}
- 400 - BAD REQUEST:如果請求為null,則通知客戶端請求不正確。
- 409 - 衝突:如果新客戶的ID已經存在於資料儲存中,那麼它就是衝突請求。
- 201 - 建立:所有驗證都成功,資料將插入到儲存中。
PUT
此方法允許使用者更新現有資料記錄。此請求的端點是/ customers,資料作為正文的一部分發送,因此不再需要請求引數。
@RequestMapping(value = {""}, method = RequestMethod.PUT)
ResponseEntity<?> update(@RequestBody Customer customer){
if(customer == null)
return new ResponseEntity(HttpStatus.BAD_REQUEST); // HTTP 400
if(!customerRepository.existsById(customer.getId()))
return new ResponseEntity(HttpStatus.BAD_REQUEST); // HTTP 400
return new ResponseEntity<>(customerRepository.save(customer), HttpStatus.CREATED); // HTTP 201
}
- 400 - BAD REQUEST:如果正文是空的,或者客戶在資料儲存中不可用。
- 201 - 建立:沒有用於更新的標準HTTP程式碼,因此我們可以使用201進行更新。
DELETE
此方法應用於刪除請求。此請求的端點是/ customers / {id}。請求中的指定ID將從儲存中刪除。
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
ResponseEntity<Object> delete(@PathVariable String id){
if(!customerRepository.existsById(id))
return new ResponseEntity<>(HttpStatus.BAD_REQUEST); // HTTP 400
customerRepository.deleteById(id);
return new ResponseEntity<>(HttpStatus.NO_CONTENT); // HTTP 204
}
- 400 - BAD REQUEST:如果資料儲存中不存在id,那麼這是一個錯誤的請求。
- 204 - NO CONTENT:刪除後資料將不可用,因此在這種情況下204是合適的。我們也可以考慮使用200。
歡迎大家加入粉絲群:963944895,群內免費分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服務、Dubbo框架、Redis快取、RabbitMq訊息、JVM調優、Tomcat容器、MySQL資料庫教學視訊及架構學習思維導圖