您好,登錄后才能下訂單哦!
小編給大家分享一下SpringMVC開發restful API之用戶查詢的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一,什么是restful風格?
首先,我們來看幾組例子。
傳統的url:
查詢 /user/query?name=tom GET
詳情 /user/query?id=1 GET
創建 /user/create?name=tom POST
修改 /user/update?id=1&name=jerry POST
刪除 /user/delete?id=1 GET
restful風格的url:
查詢 /user?name=tom GET
詳情 /user/1 GET
創建 /user POST
修改 /user/1 PUT
刪除 /user/1 DELETE
經過上面的幾組對比,我們可以得出結論:
傳統的URL是通過鏈接表示行為,而restful風格是用URL描述資源
使用HTTP方法描述行為,使用HTTP狀態碼表示不同的結果。在傳統的請求方式上,我們一般會采用POST和GET方法來發送請求,而在restful風格中它使用GET表示查詢請求,POST表示增加的請求,PUT表示修改的請求,DELETE表示刪除的請求。在傳統的請求中,無論你請求的成功與否,它都會給你返回一大串的json格式的數據來描述請求的結果,但是在restful風格中,它對不同的結果都有不同的狀態碼來描述不同的結果。
使用json格式的數據來交互。在傳統的URL中,我們常常會將有些信息通過鏈接的形式發送給服務器,但是在restful風格中這些傳遞給服務器或者傳給前臺的數據都會使用json格式的數據來傳遞。
最后一點,要強調的是,restful是中風格,并不是強制要求的規范。
二,使用Sring MVC的restful風格開發用戶請求的案例
接下來,讓我們用實例來體驗一下restful風格。
首先,我們創建maven項目。
在src/main/java包下創建一個包,然后在這個包下床架一個controller類
import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import cn.shinelon.vo.User; import cn.shinelon.vo.UserQueryCondition; /** * @author Shinelon * */ @RestController public class UserController { @RequestMapping(value="/user",method=RequestMethod.GET) //required表示是否是必須要填的,false表示不需要,然后defaultValue表示默認值 // public List<User> query(@RequestParam(required=false,defaultValue="jerrty") String username){ //當前臺需要傳來多個值的時候,可以把參數封裝到一個對象中 //pageable表示分頁的信息,同樣的,如果前臺沒有傳來數據,也可以給分頁信息來設置默認值 public List<User> query(UserQueryCondition condition,@PageableDefault(size=15,page=3,sort="username,asc") Pageable pageable){ System.out.println(pageable.getPageSize()); System.out.println(pageable.getPageNumber()); System.out.println(pageable.getSort()); //使用反射來輸出查詢的參數 System.out.println(ReflectionToStringBuilder.toString(condition,ToStringStyle.MULTI_LINE_STYLE)); List<User> list=new ArrayList<User>(); list.add(new User()); list.add(new User()); list.add(new User()); return list; } }
先介紹一下上面的代碼的含義,我們使用@RestController注解來聲明這個類是使用了restful風格的controller控制層,@RequestMapping這個注解相信大家都不陌生吧,它的第一個屬性表示你的請求路徑,第二個是你的請求的方法,如果在一個方法前面加入這個注解,我們就可以通過這個注解上表示的URL來請求到這個方法的操作以及返回結果。
//required表示是否是必須要填的,false表示不需要,然后defaultValue表示默認值 // public List<User> query(@RequestParam(required=false,defaultValue="jerrty") String username){
在這段代碼中,我們可以使用@RequestParam注解來顯示的指明傳遞的參數,required表示是否是必須要填的,false表示不需要,然后defaultValue表示默認值,表示如果前臺沒有傳遞這個參數,就使用這個默認值。當然,如果你前臺傳遞的參數和你的方法參數一樣的話就不用指明這個注釋了,它會自動的給這個方法傳遞參數,這也體現了spring的強大之處。
//當前臺需要傳來多個值的時候,可以把參數封裝到一個對象中 //pageable表示分頁的信息,同樣的,如果前臺沒有傳來數據,也可以給分頁信息來設置默認值 public List<User> query(UserQueryCondition condition,@PageableDefault(size=15,page=3,sort="username,asc") Pageable pageable){
在看上面這段代碼,如果前臺傳遞來幾個參數,那很好辦,我們只要給這個方法多幾個形參就可以,但是如果前臺傳遞來大量的信息,我們還會創建那么多的參數嗎?那樣恐怕會使你的代碼特別難看吧。這時,我們可以將多個參數封裝到一個對象中,而在這個方法中傳遞這個對象的一個引用,如上面的代碼我們將查詢的請求全部封裝到了一個UserQueryCondition 的類中。這樣就化簡了代碼,也讓更加有了層次性。
我們在src/main/java路徑下創建一個VO層,然后創建UserQueryCondition 類如下:
public class UserQueryCondition { public String username; public String sex; public int age; public String address; //省略set,get方法 }
在VO層,另一個Javabean是USER類,代碼如下:
public class User { public String username; public String password; //省略set,get方法 }
我們接著上面的講解,Pageable這個類可以傳遞分頁的信息,比如每頁的信息數量,頁數等等信息,@PageableDefault(size=15,page=3,sort=”username,asc”) 這個參數表示分頁信息的默認值,如果我們不傳遞分頁的信息,那么它將默認每頁的大小size為15,頁數page為第三頁,分類的方式是使用username,采用asc升序的方式排列。
解釋完上面的代碼我們就可以開始測試,相信大家都知道,后臺開發就頭疼的就是測試,你每次測試都要啟動服務器,這樣很浪費時間,不過在這里我們可以采用spring提供的測試的平臺,我們就可以不用每次去啟動服務器了,哈哈哈,體會到了spring的強大之處了吧。話不多說,先看代碼。
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; /** * @author Shinelon * */ @RunWith(SpringRunner.class) @SpringBootTest public class UserControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void setup() { mockMvc=MockMvcBuilders.webAppContextSetup(wac).build(); } @Test public void whenQuerySuccess() throws Exception { // mockMvc.perform(MockMvcRequestBuilders.get("/user") // .contentType(MediaType.APPLICATION_JSON_UTF8)) // .andExpect(MockMvcResultMatchers.status().isOk()) // .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3)); //在STS里的偏好設置中設置了這幾個類,所以可以自動引入其靜態方法 mockMvc.perform(get("/user") // .param("username", "shinelon") .param("username", "shinelon") .param("sex", "male") .param("age", "18") .param("address", "北京市") .param("size", "15") //分頁的信息 .param("page", "3") .param("sort", "age,desc") //按照年齡升序排列 .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(status().isOk()) .andExpect(jsonPath("$.length()").value(3)); } }
在這里,我們使用springboot,@SpringBootTest注解聲明下面這個類為springboot的測試類,我們可以去src/test/java這個路徑下去創建這個類,@Before這個注解是前置聲明,表示每次測試之前都會先執行這段代碼,在這里,我們創建了mockMvc這個來,這是spring提供的一種測試類,讀者可以去查查其API,這里不做詳細介紹了。
// mockMvc.perform(MockMvcRequestBuilders.get("/user") // .contentType(MediaType.APPLICATION_JSON_UTF8)) // .andExpect(MockMvcResultMatchers.status().isOk()) // .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
這里,介紹一下這段注釋掉的代碼,和下面的那段代碼作用相同,不過下面的代碼更加簡潔,我們可以在eclipse中的偏好設置favorite中設置MockMvcRequestBuilders,MockMvcResultMatchers這兩個類型的設置,這樣就可以化簡代碼,eclipse將會自動加入其靜態方法,這里讀者可能看不出來是什么意思,自己試一下就會感受到了,不會的可以留言哈。
mockMvc.perform(get("/user") // .param("username", "shinelon") .param("username", "shinelon") .param("sex", "male") .param("age", "18") .param("address", "北京市") .param("size", "15") //分頁的信息 .param("page", "3") .param("sort", "age,desc") //按照年齡升序排列 .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(status().isOk()) .andExpect(jsonPath("$.length()").value(3));
最后,上面的代碼時我們測試的參數,比如username,age,還有分頁的信息等等,這類似與我們前臺URL或者表單中提交到后臺的參數。這里還有一點要介紹的是.andExpect(jsonPath(“$.length()”).value(3)),這段代碼表示前臺期望返回的是一個json格式的數據其長度為3,這種寫法讀者可以去github上搜索jsonPath這個關鍵字,上面有官方的詳細介紹文檔。
最后我們啟動程序,看控制臺輸出的結果,下面是控制臺打印的主要信息。怎么樣,是不是感受到了restful的風格,自己動手試試會更加深有體會。
15 3 age: DESC cn.shinelon.vo.UserQueryCondition@ee96866[ username=shinelon sex=male age=18 address=北京市 ]
以上是“SpringMVC開發restful API之用戶查詢的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。