RESTful風格的API接口


理解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 的源碼

RestController

 

請求方式

@RequestMapping 在RequestMapping的源碼中提到,這種支持任意請求方式,類似於自適應。 RequestMapping.png

@GetMapping 客戶端只能用 GET 方式請求,適用於查詢數據 GetMapping.png

@PostMapping 客戶端只能用 POST方式請求,適用於提交數據。 PostMapping.png

@DeleteMapping 客戶端只能用 DELETE方式請求,使用於刪除數據。 DeleteMapping.png

@PutMapping 客戶端只能用 PUT方式請求,使用於修改數據(但在實際使用中,我個人建議還是采用POST方式較為妥當)。 PutMapping.png

以上請求我是在接口開發中經常使用的,圖片是注解源碼。當然還有其他一些。關於請求方式及使用范圍,可以參考 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 可以支持的數據格式。 我一般常用的基本數據類型有 intString

而我們在日常中,還可能有 ArrayListMap……

那么,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,如果你有興趣,那就來學習一下吧。

閑話少說,直接看效果:

 

swagger2.png

代碼,請看這里: api-demo ,如果可以請 star。

詳細講解,請看這里: Spring Boot中使用Swagger2構建強大的RESTful API文檔

需要你想學習更多,你可以看下: TestController

后記

至此,你一定能寫出漂亮、簡潔、優雅的API接口。如果你在開發中遇到關於接口的問題,歡迎與我交流!

參考資料:

 

轉載於:https://my.oschina.net/fengwenyi/blog/1622011

 
 

 參考 :https://blog.csdn.net/qq_41996454/article/details/105821519?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM