SpringBoot中怎么支持Restful

SpringBoot 中怎么支持Restful,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

寧海ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!

一、RESTful風(fēng)格API的好處

  • RESTful是基于http方法的API設(shè)計(jì)風(fēng)格,而不是一種新的技術(shù). url和http的method和statuscode都是很有歷史的技術(shù)。

  • 看Url就知道要什么資源

  • 看http method就知道針對(duì)資源干什么

  • 看http status code就知道結(jié)果如何

規(guī)范了程序員的代碼開(kāi)發(fā),為前端后端交互減少了接口交流的口舌成本,是"約定大于配置"的體現(xiàn)。通過(guò)下面的設(shè)計(jì),大家來(lái)理解一下這三句話。

二、RESTful風(fēng)格API的設(shè)計(jì)風(fēng)格

  1. REST 是面向資源的(名詞)

REST 通過(guò) URI 暴露資源時(shí),會(huì)強(qiáng)調(diào)不要在 URI 中出現(xiàn)動(dòng)詞。比如:

不符合REST的接口URI符合REST接口URI功能
GET /api/getDogsGET /api/dogs/{id}獲取一個(gè)小狗狗
GET /api/getDogsGET /api/dogs獲取所有小狗狗
GET /api/addDogsPOST /api/dogs添加一個(gè)小狗狗
GET /api/editDogs/{id}PUT /api/dogs/{id}修改一個(gè)小狗狗
GET /api/deleteDogs/{id}DELETE /api/dogs/{id}刪除一個(gè)小狗狗
  1. 用HTTP方法體現(xiàn)對(duì)資源的操作(動(dòng)詞)

  • GET : 獲取資源

  • POST : 添加資源

  • PUT : 修改資源

  • DELETE : 刪除資源

實(shí)際上,這四個(gè)動(dòng)詞實(shí)際上就對(duì)應(yīng)著增刪改查四個(gè)操作,這就利用了HTTP動(dòng)詞來(lái)表示對(duì)資源的操作

  1. HTTP狀態(tài)碼

通過(guò)HTTP狀態(tài)碼體現(xiàn)動(dòng)作的結(jié)果,不要自定義

200 OK 
400 Bad Request 
500 Internal Server Error

在 APP 與 API 的交互當(dāng)中,其結(jié)果逃不出這三種狀態(tài):

  • 所有事情都按預(yù)期正確執(zhí)行完畢 - 成功

  • APP 發(fā)生了一些錯(cuò)誤 – 客戶端錯(cuò)誤(如:校驗(yàn)用戶輸入身份證,結(jié)果輸入的是軍官證,就是客戶端錯(cuò)誤)

  • API 發(fā)生了一些錯(cuò)誤 – 服務(wù)器端錯(cuò)誤(各種編碼bug或服務(wù)內(nèi)部自己導(dǎo)致的異常)

這三種狀態(tài)與上面的狀態(tài)碼是一一對(duì)應(yīng)的。如果你覺(jué)得這三種狀態(tài),分類(lèi)處理結(jié)果太寬泛,http-statuscode還有很多。建議還是要遵循KISS(Keep It Stupid and Simple)原則,上面的三種狀態(tài)碼完全可以覆蓋99%以上的場(chǎng)景。三個(gè)狀態(tài)碼大家都記得住,多了就不一定了。

  1. Get方法和查詢參數(shù)不應(yīng)該改變數(shù)據(jù)

改變數(shù)據(jù)的事交給POST、PUT、DELETE

  1. 使用復(fù)數(shù)名詞

/dogs 而不是 /dog

  1. 復(fù)雜資源關(guān)系的表達(dá)

GET /cars/711/drivers/ 返回 使用car 711的所有司機(jī)

GET /cars/711/drivers/4 返回 使用car 711的4號(hào)司機(jī)

  1. 高級(jí)用法:HATEOAS

Hypermedia as the Engine of Application State 超媒體作為應(yīng)用狀態(tài)的引擎 RESTful API最好做到Hypermedia,或HATEOAS,即返回結(jié)果中提供鏈接,連向其他API方法,使得用戶不查文檔,也知道下一步應(yīng)該做什么。比如,當(dāng)用戶向api.example.com的根目錄發(fā)出請(qǐng)求,會(huì)得到這樣一個(gè)文檔。

{"link": {
  "rel":   "collection https://www.example.com/zoos",
  "href":  "https://api.example.com/zoos",
  "title": "List of zoos",
  "type":  "application/vnd.yourformat+json"
}}

上面代碼表示,文檔中有一個(gè)link屬性,用戶讀取這個(gè)屬性就知道下一步該調(diào)用什么API了。

  1. 為集合提供過(guò)濾 排序 選擇和分頁(yè)等功能

  • Filtering過(guò)濾:

使用唯一的查詢參數(shù)進(jìn)行過(guò)濾:
GET /cars?color=red 返回紅色的cars
GET /cars?seats<=2 返回小于兩座位的cars集合
  • Sorting排序:

允許針對(duì)多個(gè)字段排序
GET /cars?sort=-manufactorer,+model
這是返回根據(jù)生產(chǎn)者降序和模型升序排列的car集合
  • Field selection

移動(dòng)端能夠顯示其中一些字段,它們其實(shí)不需要一個(gè)資源的所有字段,給API消費(fèi)者一個(gè)選擇字段的能力,
這會(huì)降低網(wǎng)絡(luò)流量,提高API可用性。
GET /cars?fields=manufacturer,model,id,color
  • Paging分頁(yè)

使用 limit 和offset.實(shí)現(xiàn)分頁(yè),缺省limit=20 和offset=0;
GET /cars?offset=10&limit=5
  1. 版本化你的API

使得API版本變得強(qiáng)制性,不要發(fā)布無(wú)版本的API。
/api/v1/blog
面向擴(kuò)展開(kāi)放,面向修改關(guān)閉。

三、開(kāi)發(fā)REST接口

  1. 第一步:定義資源(對(duì)象)

@Data
@Builder
public class Article {

    private Long  id;
    private String author;
    private String title;
    private String content;
    private Date createTime;
}
  • @Data注解幫我們定義了一系列常用方法,如:getters、setters、hashcode、equals等

  1. 第二步:HTTP方法與Controller(動(dòng)作)

@Slf4j
@RestController
@RequestMapping("/rest")
public class ArticleRestController {

 
    @RequestMapping(value = "/article", method = POST, produces = "application/json")
    public AjaxResponse saveArticle(@RequestBody Article article) {

        log.info("saveArticle:{}",article);
        return  AjaxResponse.success(article);
    }
 
    @RequestMapping(value = "/article/{id}", method = DELETE, produces = "application/json")
    public AjaxResponse deleteArticle(@PathVariable Long id) {

        log.info("deleteArticle:{}",id);
        return AjaxResponse.success(id);
    }
 
    @RequestMapping(value = "/article/{id}", method = PUT, produces = "application/json")
    public AjaxResponse updateArticle(@PathVariable Long id, @RequestBody Article article) {
        article.setId(id);

        log.info("updateArticle:{}",article);
        return AjaxResponse.success(article);
    }
 
    @RequestMapping(value = "/article/{id}", method = GET, produces = "application/json")
    public AjaxResponse getArticle(@PathVariable Long id) {

        Article article1 = Article.builder().id(1L).author("zimug").content("spring boot 2.深入淺出").createTime(new Date()).title("t1").build();
        return AjaxResponse.success(article1);
    }
}
  • 加上@Slf4j注解,就可以直接使用log變量打印日志

下面這個(gè)類(lèi)是用于統(tǒng)一數(shù)據(jù)響應(yīng)接口標(biāo)準(zhǔn)的。它的作用是:統(tǒng)一所有開(kāi)發(fā)人員響應(yīng)前端請(qǐng)求的返回結(jié)果格式,減少前后端開(kāi)發(fā)人員溝通成本,是開(kāi)發(fā)約定的落地。在異常處理的章節(jié)會(huì)做更加詳細(xì)的說(shuō)明。

public class AjaxResponse {

    private boolean isok;   //請(qǐng)求是否處理成功
    private int code;          //請(qǐng)求響應(yīng)狀態(tài)碼(200、400、500)
    private String message;  //請(qǐng)求結(jié)果描述信息
    private Object data;  //請(qǐng)求結(jié)果數(shù)據(jù)

    private AjaxResponse() {

    }

    public static AjaxResponse success() {
        AjaxResponse resultBean = new AjaxResponse();
        resultBean.setIsok(true);
        resultBean.setCode(200);
        resultBean.setMessage("success");
        return resultBean;
    }

    public static AjaxResponse success(Object data) {
        AjaxResponse resultBean = new AjaxResponse();
        resultBean.setIsok(true);
        resultBean.setCode(200);
        resultBean.setMessage("success");
        resultBean.setData(data);
        return resultBean;
    }

    // getter / setter 略
}

四、REST接口開(kāi)發(fā)常用的注解

  1. @RestController與@Controller

@RestController相當(dāng)于 @Controller和@ResponseBody結(jié)合。它有兩層含義:一是作為控制器注入到Spring上下文環(huán)境,二是請(qǐng)求響應(yīng)為數(shù)據(jù)序列化(默認(rèn)序列化方式是JSON),而不是跳轉(zhuǎn)到html或模板頁(yè)面。

  1. @RequestMapping 與@GetMapping、@PutMapping、@PostMapping、@DeleteMapping

@RequestMapping(value = “/article”, method = RequestMethod.GET) 新方法可以簡(jiǎn)寫(xiě)為: @GetMapping("/article"),其他同理。

  1. @RequestBody與@ResponseBody

用于接收和響應(yīng)序列化數(shù)據(jù)(JSON),可以支持嵌套JSON數(shù)據(jù)結(jié)構(gòu)。

  1. @PathVariable 與@RequestParam

PathVariable用于URI上的{參數(shù)}
RequestParam用于接收普通方式提交的參數(shù)

看完上述內(nèi)容,你們掌握SpringBoot 中怎么支持Restful的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)站欄目:SpringBoot中怎么支持Restful
網(wǎng)站URL:http://muchs.cn/article20/pphsco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、建站公司、網(wǎng)站設(shè)計(jì)公司、App開(kāi)發(fā)、微信公眾號(hào)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作