亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

淺談Spring Boot 開發REST接口最佳實踐

2024-07-13 10:16:30
字體:
來源:轉載
供稿:網友

本文介紹了Spring Boot 開發REST接口最佳實踐,分享給大家,具體如下:

HTTP動詞與SQL命令對應

GET

從服務器獲取資源,可一個或者多個,對應SQL命令中的SELECTGET /users獲取服務器上的所有的用戶信息GET /users/ID獲取指定ID的用戶信息

POST

在服務器上創建一個新資源,對應SQL命令中的CREATEPOST /users創建一個新的用戶

PUT

在服務器上更新一個資源,客戶端提供改變后的完整資源,對應SQL命令中的UPDATEPUT /users/ID更新指定ID的用戶的全部信息

DELETE

從服務器上刪除一個資源,對應SQL命令中的DELETEDELETE /users/ID刪除指定ID的用戶信息

PATCH

在服務器更新一個資源的部分屬性,對應SQL命令中的UPDATEPATCH /users/ID更新指定ID的用戶的某個屬性

URL中的約定

URL中名詞使用復數形式

URL中的名稱是使用單數還是使用復數的問題,爭議由來已久。URL中的名詞一般對應數據庫中的表,表中存儲的是同類數據, 在實踐中我是強制使用復數形式 ,看上去更舒服些。

/users/users/1/roles/roles/1

至于一些不規則的、不可數的名詞就見仁見智吧。

/heroes/heroes/1/people/people/1/foots/foots/1/feet/feet/1

版本

講版本號加入到URL中以應對不兼容的和破壞性的更改。發布新API時,客戶端可以自如的遷移到新API,不會因調用完全不同的新API而陷入窘境。使用直觀的“V”前綴來表示后面的數字是版本號,不需要次級版本號,不應該頻繁的發布API版本。

/edu/v1/users/edu/v1/roles

對可選的、復雜的參數使用查詢字符串

為了讓URL更小、更簡潔,為資源設置一個基本URL,講可選的、復雜的參數用查詢字符串表示。

/edu/v1/users?enabled=1&roleid=1

提供分頁信息

一次性返回數據庫中的所有的資源不是一個好主意,因此需要提供分頁機制。通常使用數據庫中眾所周知的參數offset和limit

/edu/v1/users?enabled=1&offset=1&limit=15

如果客戶端沒有傳遞這些參數,則應使用默認值,通常offset=0,limit=10。

非資源請求使用動詞

有時API調用并不涉及資源,在這種情況下,服務器執行一個操作病將結果返回給客戶端。

/edu/v1/calc?p=100

考慮特定資源和跨資源搜索

提供對特定止緣的搜索很容易,只需要使用相應的資源集合,并將搜索字符串附加到查詢參數中即可。

/edu/v1/users?username=李慶海

如果需要對所有資源提供全局搜索,則需要使用其他方法。

/edu/v1/search?key=李慶海

響應結果

使用小駝峰命名法作為屬性標識符

通常,RESTful Web服務將被JavaScript編寫的客戶端使用。客戶端會將JSON響應轉換為JavaScript對象,然后調用其屬性。因此,最好遵循JavaScript代碼通用規范。

person.year_of_birth // 不推薦,違反JavaScript代碼通用規范 person.YearOfBirth // 不推薦,JavaScript構造方法命名 person.yearOfBirth // 推薦

提供分頁信息

返回結果比較多時,應提供分頁信息。

{  "page": 0,  "size": 10,  "total": 3465,  "obj": [    ] }

Spring MVC開發REST接口

常用注解

@RestController

@RestController是@ResponseBody和@Controller的組合注解。

@RequestMapping

此注解即可以作用在控制器的某個方法上,也可以作用在此控制器類上。當控制器在類級別上添加@RequestMapping注解時,這個注解會應用到控制器的所有處理器方法上。處理器方法上的@RequestMapping注解會對類級別上的@RequestMapping的聲明進行補充。

@PostMapping

組合注解,是@RequestMapping(method =RequestMethod.POST)的縮寫。

@PutMapping

組合注解,是@RequestMapping(method = RequestMethod.PUT)的縮寫。

@PatchMapping

組合注解,是@RequestMapping(method = RequestMethod.PATCH)的縮寫。

@DeleteMapping

組合注解,是@RequestMapping(method = RequestMethod.DELETE)的縮寫。

@GetMapping

組合注解,是@RequestMapping(method = RequestMethod.GET)的縮寫。

@PathVariable

獲取url中的數據。

@RequestParam

獲取請求參數的值。

REST接口及Swagger 編寫API文檔示例

關于Swagger的使用可參考Spring Boot 項目中使用Swagger2 。方法體中的代碼不重要,重要的是方法的簽名以及與HTTP動詞的映射。

import java.util.Date;import javax.persistence.EntityNotFoundException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PatchMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import cn.com.infcn.jianshu.Service.UserService;import cn.com.infcn.jianshu.exception.BizException;import cn.com.infcn.jianshu.exception.LoginNameOrPasswordErrorException;import cn.com.infcn.jianshu.exception.ResourceExistsException;import cn.com.infcn.jianshu.model.User;import cn.com.infcn.jianshu.util.JsonResult;import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation;import io.swagger.annotations.ApiParam;/** * 系統用戶Controller *  * @author 李慶海 * */@Api(value = "系統用戶接口", tags = "系統管理")@RestController@RequestMapping("/v3/edu/users")public class UserController { @Autowired private UserService userService; /**  * 添加用戶,注冊  *   * @param loginName  *   登錄賬號  * @param userName  *   用戶名稱  * @param password  *   登錄密碼  * @param roleId  *   用戶角色  * @return  * @throws ResourceExistsException  */ @ApiOperation(value = "添加用戶") @PostMapping("/") public JsonResult create(   @ApiParam(name = "loginName", value = "登錄賬號", required = true) @RequestParam(required = true) @RequestBody String loginName,   @ApiParam(name = "userName", value = "用戶名稱", required = true) @RequestParam(required = true) @RequestBody String userName,   @ApiParam(name = "password", value = "登錄密碼", required = true) @RequestParam(required = true) @RequestBody String password,   @ApiParam(name = "roleId", value = "用戶角色編號", required = true) @RequestParam(required = true) @RequestBody String roleId)   throws ResourceExistsException {  boolean exists = this.userService.exists(loginName);  if (exists) {   throw new ResourceExistsException(loginName);  }  User user = userService.create(loginName, password, userName, roleId);  return JsonResult.success(user); } /**  * 用戶憑借登錄賬號和登錄密碼進行登錄  *   * @param loginName  *   登錄賬號  * @param password  *   登錄密碼  * @throws EntityNotFoundException  */ @ApiOperation(value = "根據用戶編號查詢用戶信息") @GetMapping("/login") public JsonResult login(   @ApiParam(name = "loginName", value = "登錄賬號", required = true) @RequestParam(required = true) String loginName,   @ApiParam(name = "password", value = "登錄密碼", required = true) @RequestParam(required = true) String password)   throws LoginNameOrPasswordErrorException {  User user = this.userService.login(loginName, password);  if (null == user) {   throw new LoginNameOrPasswordErrorException();  }  return JsonResult.success(user); } /**  * 根據用戶編號查詢用戶信息  *   * @param id  *   用戶編號  * @throws EntityNotFoundException  */ @ApiOperation(value = "根據用戶編號查詢用戶信息") @GetMapping("/{id}") public JsonResult read(   @ApiParam(name = "id", value = "用戶編號,主鍵", required = true) @PathVariable(required = true) String id)   throws EntityNotFoundException {  User user = this.userService.getOne(id);  return JsonResult.success(user); } /**  * 賬戶注銷,不刪除用戶的數據  *   * @param userId  *   用戶編號  * @return  */ @ApiOperation(value = "注銷賬戶") @PatchMapping("/{id}") public JsonResult cancel(   @ApiParam(name = "id", value = "用戶編號,主鍵", required = true) @PathVariable(required = true) String id)   throws EntityNotFoundException {  this.userService.cancel(id);  return JsonResult.success(); } /**  * 重置密碼  *   * @param id  *   用戶編號  * @param password  *   新登錄密碼  * @return  */ @ApiOperation(value = "重置密碼") @PatchMapping("/") public JsonResult updatePassword(   @ApiParam(name = "id", value = "用戶編號,主鍵", required = true) @RequestParam(required = true) String id,   @ApiParam(name = "password", value = "新登錄密碼", required = true) @RequestParam(required = true) String password) {  this.userService.updatePassword(id, password);  return JsonResult.success(); } /**  * 多條件組合查詢  *   * @param userName  *   用戶名稱  * @param roleId  *   用戶角色  * @param start  *   開始日期  * @param end  *   結束日期  * @param page  *   分頁,從0開始  * @param size  *   每頁的行數,默認10  * @return  * @throws BizException  */ @ApiOperation(value = "用戶信息查詢") @GetMapping("/") public JsonResult query(   @ApiParam(name = "userName", value = "用戶名稱,查詢關鍵詞", required = false) @RequestParam(required = false) String userName,   @ApiParam(name = "roleId", value = "用戶角色編號", required = false) @RequestParam(required = false) String roleId,   @ApiParam(name = "start", value = "用戶角色編號", required = false) @RequestParam(required = false) Date start,   @ApiParam(name = "end", value = "用戶角色編號", required = false) @RequestParam(required = false) Date end,   @ApiParam(name = "page", value = "分頁,第幾頁,從1開始", defaultValue = "1", required = true) @RequestParam(defaultValue = "1", required = true) int page,   @ApiParam(name = "size", value = "每頁的行數,正整數", defaultValue = "10", required = true) @RequestParam(defaultValue = "10", required = true) int size)   throws BizException {  Page<User> datas = this.userService.findDatas(userName, roleId, start, end, page, size);  if (null == datas || null == datas.getContent() || datas.getContent().isEmpty()) {   throw new BizException("用戶不存在");  }  return JsonResult.success(datas); }}

Swagger2接口文檔效果圖

Spring,Boot,REST接口,REST

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩精品久久| 少妇高潮久久77777| 久久99热精品| 亚洲午夜小视频| 欧美亚洲国产另类| 欧美乱大交xxxxx另类电影| 亚洲国产欧美一区二区三区久久| 欧美激情一区二区三级高清视频| 亚洲第五色综合网| 国产精品久久久久福利| 日韩av电影在线播放| 亚洲综合在线做性| 久久免费成人精品视频| 亚洲一区二区中文| 欧美一性一乱一交一视频| 91色琪琪电影亚洲精品久久| 久久精品视频免费播放| 日韩在线中文字幕| 久久久亚洲欧洲日产国码aⅴ| 国产丝袜一区二区三区免费视频| 成人黄色片网站| 精品亚洲夜色av98在线观看| 91av视频在线免费观看| 亚洲女同性videos| 欧美交受高潮1| 久久久精品国产亚洲| 一区二区三欧美| 欧洲美女免费图片一区| 色综合亚洲精品激情狠狠| 亚洲午夜未满十八勿入免费观看全集| 欧美激情国产高清| 国内精品久久久| 国产91精品最新在线播放| 欧美激情精品久久久久久久变态| 亚洲a一级视频| 欧美在线一级视频| 精品欧美国产一区二区三区| 九九热这里只有在线精品视| 亚洲精品女av网站| 91高清视频免费| 精品久久久久久久久国产字幕| 久久午夜a级毛片| 国产精品户外野外| 一本色道久久综合亚洲精品小说| 国产精品自产拍在线观| 久久久久久久久久国产精品| 在线免费看av不卡| 一本色道久久88综合亚洲精品ⅰ| 欧美色道久久88综合亚洲精品| 欧美日韩国产成人在线观看| 亚洲日本成人网| 亚洲成人三级在线| 九九热99久久久国产盗摄| 精品偷拍一区二区三区在线看| 国产精品视频在线播放| 搡老女人一区二区三区视频tv| 欧美日韩中文在线观看| 精品日韩中文字幕| 久久久视频免费观看| 欧美专区在线视频| 久久久久久久久91| 国产一区二区三区直播精品电影| 日韩亚洲第一页| www.欧美免费| 亚洲男人天天操| 国产精品国产福利国产秒拍| 日韩电影中文字幕| 国产精品美女www爽爽爽视频| 久久大大胆人体| 欧美一区二区三区艳史| 国产91在线视频| 欧美精品电影免费在线观看| 日韩在线视频观看正片免费网站| 亚洲国产精品久久久久久| 日韩av免费在线播放| 亚洲乱码国产乱码精品精天堂| 国产精品一区二区三区久久| 久久亚洲综合国产精品99麻豆精品福利| 久久久国产在线视频| 91成人免费观看网站| 亚洲国产精品一区二区久| 国产一区二中文字幕在线看| 日韩精品免费一线在线观看| 国产精品成人一区| 4k岛国日韩精品**专区| 欧美亚洲国产精品| 国产裸体写真av一区二区| 欧美巨乳在线观看| 欧美性极品xxxx做受| 久久成人av网站| 国产99在线|中文| 91国产视频在线播放| 成人av.网址在线网站| 亚洲免费视频一区二区| 国产日韩欧美综合| 亚洲国产成人精品久久| 亚洲人成电影网站色www| 亚洲精品一区二区三区不| 91av在线免费观看视频| 91久久夜色精品国产网站| 亚洲最大成人免费视频| 欧美激情国产高清| 久久中文字幕在线视频| 成人免费视频xnxx.com| 中文字幕最新精品| 午夜精品久久久久久久久久久久| 久热99视频在线观看| 日韩中文字幕第一页| 亚洲男人天堂视频| 韩国福利视频一区| 菠萝蜜影院一区二区免费| 亚洲精品视频播放| 91九色视频导航| 欧美午夜女人视频在线| 国外日韩电影在线观看| 国产精品日韩欧美大师| 亚洲国产一区二区三区在线观看| 国产精品视频地址| 久久99视频精品| 91禁外国网站| 亚洲精品一区二区久| 日韩中文字幕免费视频| 国产欧美日韩高清| 欧美成人免费全部观看天天性色| 欧美日韩不卡合集视频| 成人妇女免费播放久久久| 欧美色视频日本高清在线观看| 欧美激情视频播放| 日韩av成人在线| 九九视频直播综合网| www.欧美精品一二三区| 欧美一区二区三区……| 精品国产福利视频| 91经典在线视频| 久久久国产精品x99av| 久久久久久国产三级电影| 久久人人爽人人爽人人片av高清| 国产脚交av在线一区二区| 久久亚洲精品网站| 日韩精品中文字幕视频在线| 俺去亚洲欧洲欧美日韩| 欧美日韩免费网站| 亚洲色图偷窥自拍| 久久香蕉国产线看观看av| 久久综合五月天| 538国产精品一区二区免费视频| 中文字幕在线观看亚洲| 亚洲自拍偷拍网址| 精品国产乱码久久久久久虫虫漫画| 精品国产区一区二区三区在线观看| 国产精品美女久久久久av超清| 青草热久免费精品视频| 成人两性免费视频| 欧美极品美女电影一区| 国色天香2019中文字幕在线观看| 亚洲美女中文字幕| 欧美日韩国产91| 91高清视频免费观看| 国产这里只有精品| 欧美日韩一区二区免费视频| 国产午夜精品理论片a级探花| 国产精品久久久久国产a级| 亚洲午夜av久久乱码| 深夜福利日韩在线看|