理解RESTful接口 :https://www.cnblogs.com/ecs-console/p/13324085.html
傳統url接口請求與RESTful風格的區別:https://blog.csdn.net/qq_43251032/article/details/102720392
Spring對API接口開發的支持,然后我們采用Spring Boot搭建項目,借用Swagger2列出API接口,便於查閱。
返回格式
API接口要求返回的格式是 application/json
,我們知道網頁返回的格式一般是 text/html
,因此,Spring Boot為寫接口,提供了兩種實現方式:類注解 和 方法注解。
- 類注解
@RestController
我們只需要在類上寫上注解 @RestController
,那么此Controller返回格式就都是text/json
。如下圖
- 方法注解
@ResponseBody
我們只需要在某個方法上寫上注解 @ResponseBody
,那么該方法返回格式是text/json
。如下圖
值得提醒的是,雖然都可以,但我更推薦使用類注解,會顯得我們的編碼風格十分統一,代碼更加緊湊,不至於看起來零散。
我們來看下 @RestController
的源碼
請求方式
@RequestMapping 在RequestMapping的源碼中提到,這種支持任意請求方式,類似於自適應。
@GetMapping 客戶端只能用 GET
方式請求,適用於查詢數據
@PostMapping 客戶端只能用 POST
方式請求,適用於提交數據。
@DeleteMapping 客戶端只能用 DELETE
方式請求,使用於刪除數據。
@PutMapping 客戶端只能用 PUT
方式請求,使用於修改數據(但在實際使用中,我個人建議還是采用POST方式較為妥當)。
以上請求我是在接口開發中經常使用的,圖片是注解源碼。當然還有其他一些。關於請求方式及使用范圍,可以參考 RESTful API
接收參數
- @RequestParam
我們來寫一個示例並說明:
public String getInfo(@RequestParam(name = "param", required = false, defaultValue = "param dafault value") String param)
name
代表提交參數名。 required
意思是這個參數是否必需,默認true,沒有該參數,無法調用此方法;這里設為false,有無該參數都可以調用。 defaultValue
如果該參數值為空,那么就使用默認值。
- @PathVariable
@RequestMapping("/get-info/{param}") public String getInfo(@PathVariable("param") Object param)
我們可以在請求方法后面直接跟值,省去了 ?參數名=
。 這種一般配合 @DeleteMapping
、@PutMapping
使用。
- @RequestHeader
這個使用了獲取提交數據的 Headers
的值。我是用來接收 TOKEN
。后面會舉例。
四、數據格式
下面我們來了解下,Spring Boot 可以支持的數據格式。 我一般常用的基本數據類型有 int
、String
。
而我們在日常中,還可能有 Array
、List
、Map
……
那么,Spring Boot支持嗎?
這個我就不在這里探討了,因為格式的原因,我們不會用他。如果你感興趣,可以去嘗試一下。答案嘛,肯定是可以做到的咯。
問題
對於四
中的問題,我們如何解決?並且統一化呢?
JSON!
毫無疑問JSON可以幫助我們解決這個問題,當然XML也是可以的。
如何用?代碼怎么寫?前端?移動端都支持嗎?
解決方案
我已將代碼封裝到 JavaLib 庫中,所以,我們直接調用。
- 封裝並提交 POST 數據
@Test public void testPostData() { // int int pInt = 0; // String String pString = "String"; // String [] String [] pStrings = {"String [0]", "String [1]"}; // List List<String> pLists = List.of("list[0]", "list[1]"); // 。。 Map<String, Object> params = new HashMap<>(); params.put("p-int", pInt); params.put("p-string", pString); params.put("p-strings", pStrings); params.put("p-list", pLists); String url = "http://localhost:8080/api/get-info"; try { String rs = HttpUtil.post(url, null, params); System.out.println(rs); } catch (IOException e) { e.printStackTrace(); } }
- 獲取POST提交的數據
@RestController @RequestMapping("/api") public class APIController { @PostMapping("/get-info") public String getInfo(HttpServletRequest request) { try { String jsonStr = RequestUtil.getPostData(request); System.out.println(jsonStr); } catch (IOException e) { e.printStackTrace(); } return ""; } }
到這里,我相信你對接口的編寫應該游刃有余了吧!可是,我還有東西想要分享給你!
分享
先看 Ajax
代碼:
$.ajax({ headers : { Accept: "application/json; charset=utf-8", 'token' : '9B4BF951093F1F1A40BB2DAAA30B3838' }, url: URI + '/admin/blog/add', type: 'POST', async: true, data: { ... }, timeout: 3000, dataType: 'json', beforeSend: function(xhr){}, success: function(data, textStatus, jqXHR){ console.log(data); }, error: function(xhr, textStatus){ console.log(xhr); }, complete: function(){} })
現在的問題是如何獲取 token
的值?相信聰明的你,一定還記得我們早就賣好了關子!沒錯,就是 @RequestHeader("token")
!
問題還沒結束,如果我們沒在Controller,那怎么辦?
答案是
String token = request.getHeader("token");
System.out.println(token);
更新
之前因為寫的公共接口,所以也就寫的公共接口文檔(參考: 【Work】投遞服務API文檔 ),采用了 Markdown
格式。
但在實際開發中,我們可能只給前端或者APP寫接口,如果還要寫接口,那可能是相當麻煩的。所以很多人建議我更新一下。所以抽閑先更新一下,Spring Boot集成Swagger,如果你有興趣,那就來學習一下吧。
閑話少說,直接看效果:
代碼,請看這里: api-demo ,如果可以請 star。
詳細講解,請看這里: Spring Boot中使用Swagger2構建強大的RESTful API文檔
需要你想學習更多,你可以看下: TestController
后記
至此,你一定能寫出漂亮、簡潔、優雅的API接口。如果你在開發中遇到關於接口的問題,歡迎與我交流!
參考資料:
轉載於:https://my.oschina.net/fengwenyi/blog/1622011