通常的API都是什麼樣子的呢?java
查詢 /user/query?name=tom GET 詳情 /user/getInfo?id=1 GET 建立 /user/create?name=tom POST 修改 /user/update?id=1&name=jay POST 刪除 /user/delete?id=1 GET
那麼咱們但願的RESTFul API 是什麼樣子的呢?git
查詢 /user?name=tom GET 詳情 /user/1 GET 建立 /user POST 修改 /user/1 PUT 刪除 /user/1 DELETE
簡單的說,RESTFul就是:
一、用URL描述資源
二、使用HTTP方法描述行爲,使用HTTP狀態碼來表示不一樣的結果
三、使用json交互數據
四、RESTFul只是一種風格,並非強制的標準github
Level0:使用Http做爲傳輸方式
Level1:引入資源概念,每一個資源都有對應的URL
Level2:使用HTTP方法進行不一樣的操做,使用HTTP狀態碼來表示不一樣的結果
Level3:使用超媒體,在資源的表達中包含了連接信息
首先咱們先了解一些經常使用的註解web
一、@RestController 標明此Controller提供RestAPI
二、@RequestMapping及其變體。映射http請求URL到java方法
三、@RequestParam 映射請求參數到java方法的參數
四、@PageableDefault指定分頁參數默認值正則表達式
直接拿出代碼模塊來說解吧!spring
package com.myself.web.controller; import com.fasterxml.jackson.annotation.JsonView; import com.myself.dto.User; import com.myself.dto.UserQueryCondition; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; /** * @author MySelf * @create 2018/9/15 * @desc User Controller 層 **/ @RestController @RequestMapping("/user") public class UserController { /** * 獲取用戶列表 * @RequestMapping(value = "/user", method = RequestMethod.GET) * @RequestParam(name = "username",required = false,defaultValue = "tom") String nickname * @param condition {@link UserQueryCondition} * @return {@link List} */ @GetMapping() @JsonView(User.UserSimpleView.class) public List<User> query(UserQueryCondition condition,@PageableDefault(page = 2,size = 17,sort = "username,asc") Pageable pageable){ //反射工具 System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE)); System.out.println(pageable.getPageSize()); System.out.println(pageable.getPageNumber()); System.out.println(pageable.getSort()); List<User> users = new ArrayList<>(); users.add(new User()); users.add(new User()); users.add(new User()); return users; } /** * 獲取用戶信息 正則校驗參數必須爲數字 * @RequestMapping(value = "/user/{id:\\d+}", method = RequestMethod.GET) * @param idxxx {@link String} * @return {@link User} */ @GetMapping("/{id:\\d+}") @JsonView(User.UserDetailView.class) public User getInfo(@PathVariable(name = "id") String idxxx){ User user = new User(); user.setUsername("tom"); return user; } }
User Bean 對象apache
package com.myself.dto; import com.fasterxml.jackson.annotation.JsonView; /** * @author MySelf * @create 2018/9/15 * @desc User Bean **/ public class User { /** 用戶簡單視圖 */ public interface UserSimpleView {} /** 用戶詳情視圖 */ public interface UserDetailView extends UserSimpleView {} /** 用戶名 */ private String username; /** 用戶密碼 */ private String password; @JsonView(UserSimpleView.class) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @JsonView(UserDetailView.class) public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
接下來咱們就來說解一些註解的使用點,其實看着註解也能大體瞭解了。json
首先咱們在接受參數時,可使用@PathVariable映射url片斷到java方法的參數,同時也支持在url聲明中使用正則表達式,使用@JsonView控制json輸出內容。app
咱們須要在Bean中聲明對應的接口,並在值對象的get方法上指定視圖,最後在Controller方法上指定視圖便可。dom
還有就是,當咱們在處理建立請求時,還要注意可使用@RequestBody映射請求體到java方法參數,且要注意對日期類型參數的處理,也可使用@Valid註解和BindingResult驗證請求參數的合法性並處理校驗結果。
本文是針對UncleCatMySelf/myself-security(基於Spring Security + Spring Social + Spring Security OAuth + REST服務開發的案例教程,Maven多模塊開發)的GitHub項目的基礎演進。
若是本文對你有所幫助,歡迎關注本人技術公衆號,謝謝。