谈谈 Spring boot Controller API 怎麽设计

说到了 controller 就不得不说一下 API,简单来说就是负责建立客户所需的内容和产生所需回应的内容。在 Web 世界中可以把它认为是一个取得 Web 资源的中介。RESTful API 是一种规范,它应用了 HTTP 协定来存取资源,可以藉由 GET、PUT、POST 和 DELETE 等 HTTP Method 进行资源操作。

REST API 支援的资料格式有以下,其中 application/json 被广泛使用

  • application/json
  • application/xml
  • application/x-www-form-urlencoded
  • multipart/form-data

在 Spring Boot 中的 controller 我们可以藉由 @RestController 宣告说我要建立 RESTful Web 服务。以下描述了基本的 API 宣告和使用

宣告一个 GET 请求的资源,这通常用来获取资料库单一资源或是整个资源。当中的范例对应请求会是

curl -X GET -H "Content-Type: application/json" -d '{model 的资讯}' http://localhost:8080/api/list
@GetMapping(value = "/api/list", produces = APPLICATION_JSON_VALUE)
public ResponseEntity<?> post(Model model) {
    // do something
}

宣告一个 POST 请求的资源,用於新增资料或是上传档案等。当中的范例对应请求会是

curl -X POST -H "Content-Type: application/json" -d '{model 的资讯}' http://localhost:8080/api/upload
@PostMapping(value = "/api/upload",
            consumes = MULTIPART_FORM_DATA_VALUE,
            produces = APPLICATION_JSON_VALUE)
public ResponseEntity<?> post(Model model) {
    // do something
}

宣告一个 DELETE 请求的资源,用於删除资源。当中的范例对应请求会是

curl -X DELETE http://localhost:8080/api/{id} # {id} 通常会是删除该物件的主键或是可识别该物件的唯一值
@DeleteMapping("/api/{id}")
public ResponseEntity<Void> delete(@PathVariable String id) {
    // do something
}

宣告一个 PUT 请求的资源,用於更新资源。当中的范例对应请求会是

curl -X PUT -H "Content-Type: application/json" -d '{model 资讯}' http://localhost:8080/api/{id} # {id} 通常会是删除该物件的主键或是可识别该物件的唯一值
@PutMapping(value = "/api/{id}", consumes = APPLICATION_JSON_VALUE)
public void update(@PathVariable String id, Model model){
    // do something
}

当中 MULTIPART_FORM_DATA_VALUE(档案), APPLICATION_JSON_VALUE(JSON 格式) 可以约束 Client 必须传什麽数据,当违反时将会回传 4XX 代码。

  • @RequestParam
    • request header
    • 通常用於 GET 请求
    • Content-Type 为 application/x-www-form-urlencoded
      • 表单中插入数据
  • @PathVariable
    • URI Template Pattern ex. http://localhost:8080/api/show/101?param1=10&param2=20
@RequestMapping("/show/{id}")
    public String getEmployee(@PathVariable(value="id") String id,
    @RequestParam(value="param1") String param1,
    @RequestParam(value="param2") String param2){
.......
}

<<:  [Day9] 设计蒐集用户颜色偏好的简易对话流

>>:  Day 7. 关於.NET新手遇到问题,我是这样建议

重构原本的内容(golang)(Day22)

此次主要修正内容是将在定义资料库的内容移动到pq的schema中,以及将两个model都套用之前的设...

Day6 - 下单函数使用,限价、市价、删单、改单怎麽写

今天中秋节,月亮嘛...每个月都会圆一次。美股这麽活跳,别烤肉了,认真准备明天开盘才是股海好青年,放...

[Day 12] -『 GO语言学习笔记』- for range 回圈

以下笔记摘录自『 The Go Workshop 』。 Go语言只支援一种回圈回圈叙述,就是for回...

拓朴排序问题

6 拓朴排序问题 现在让我们来考虑另一个可以使用 DFS 来解决的经典范例:拓朴排序问题。想像有 N...

Day19 - 中场休息时间 - 怎麽样用Canvas精准的写出一个『字』 - 成为Canvas Ninja ~ 理解2D渲染的精髓

呃,首先呢~ 敝人小弟在下我今天仔细的思考了一下,决定这次还是再来一篇『中场休息』科普文,等到明天再...