一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringMVC開發(fā)restful API之用戶查詢代碼詳解

SpringMVC開發(fā)restful API之用戶查詢代碼詳解

2021-02-03 11:16不清不慎 Java教程

這篇文章主要介紹了SpringMVC開發(fā)restful API之用戶查詢代碼詳解,小編覺得挺不錯的,這里分享給大家,需要的朋友可以參考。下面隨小編一起看看吧。

一,什么是restful風格?

首先,我們來看幾組例子。

傳統(tǒng)的url:

查詢 /user/query?name=tom GET
詳情 /user/query?id=1 GET
創(chuàng)建 /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
創(chuàng)建 /user POST
修改 /user/1 PUT
刪除 /user/1 DELETE

經(jīng)過上面的幾組對比,我們可以得出結(jié)論:

傳統(tǒng)的URL是通過鏈接表示行為,而restful風格是用URL描述資源

使用HTTP方法描述行為,使用HTTP狀態(tài)碼表示不同的結(jié)果。在傳統(tǒng)的請求方式上,我們一般會采用POST和GET方法來發(fā)送請求,而在restful風格中它使用GET表示查詢請求,POST表示增加的請求,PUT表示修改的請求,DELETE表示刪除的請求。在傳統(tǒng)的請求中,無論你請求的成功與否,它都會給你返回一大串的json格式的數(shù)據(jù)來描述請求的結(jié)果,但是在restful風格中,它對不同的結(jié)果都有不同的狀態(tài)碼來描述不同的結(jié)果。

使用json格式的數(shù)據(jù)來交互。在傳統(tǒng)的URL中,我們常常會將有些信息通過鏈接的形式發(fā)送給服務器,但是在restful風格中這些傳遞給服務器或者傳給前臺的數(shù)據(jù)都會使用json格式的數(shù)據(jù)來傳遞。

最后一點,要強調(diào)的是,restful是中風格,并不是強制要求的規(guī)范。

二,使用Sring MVC的restful風格開發(fā)用戶請求的案例

接下來,讓我們用實例來體驗一下restful風格。
首先,我們創(chuàng)建maven項目。
在src/main/java包下創(chuàng)建一個包,然后在這個包下床架一個controller類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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){
  //當前臺需要傳來多個值的時候,可以把參數(shù)封裝到一個對象中
  //pageable表示分頁的信息,同樣的,如果前臺沒有傳來數(shù)據(jù),也可以給分頁信息來設(shè)置默認值
  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());
  //使用反射來輸出查詢的參數(shù)
  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來請求到這個方法的操作以及返回結(jié)果。

?
1
2
//required表示是否是必須要填的,false表示不需要,然后defaultValue表示默認值
// public List<User> query(@RequestParam(required=false,defaultValue="jerrty") String username){

在這段代碼中,我們可以使用@RequestParam注解來顯示的指明傳遞的參數(shù),required表示是否是必須要填的,false表示不需要,然后defaultValue表示默認值,表示如果前臺沒有傳遞這個參數(shù),就使用這個默認值。當然,如果你前臺傳遞的參數(shù)和你的方法參數(shù)一樣的話就不用指明這個注釋了,它會自動的給這個方法傳遞參數(shù),這也體現(xiàn)了spring的強大之處。

?
1
2
3
4
//當前臺需要傳來多個值的時候,可以把參數(shù)封裝到一個對象中
 
  //pageable表示分頁的信息,同樣的,如果前臺沒有傳來數(shù)據(jù),也可以給分頁信息來設(shè)置默認值
  public List<User> query(UserQueryCondition condition,@PageableDefault(size=15,page=3,sort="username,asc") Pageable pageable){

在看上面這段代碼,如果前臺傳遞來幾個參數(shù),那很好辦,我們只要給這個方法多幾個形參就可以,但是如果前臺傳遞來大量的信息,我們還會創(chuàng)建那么多的參數(shù)嗎?那樣恐怕會使你的代碼特別難看吧。這時,我們可以將多個參數(shù)封裝到一個對象中,而在這個方法中傳遞這個對象的一個引用,如上面的代碼我們將查詢的請求全部封裝到了一個UserQueryCondition 的類中。這樣就化簡了代碼,也讓更加有了層次性。

我們在src/main/java路徑下創(chuàng)建一個VO層,然后創(chuàng)建UserQueryCondition 類如下:

?
1
2
3
4
5
6
7
public class UserQueryCondition {
  public String username;
  public String sex;
  public int age;
  public String address;
  //省略set,get方法
}

在VO層,另一個Javabean是USER類,代碼如下:

?
1
2
3
4
5
public class User {
  public String username;
  public String password;
  //省略set,get方法
}

我們接著上面的講解,Pageable這個類可以傳遞分頁的信息,比如每頁的信息數(shù)量,頁數(shù)等等信息,@PageableDefault(size=15,page=3,sort=”username,asc”) 這個參數(shù)表示分頁信息的默認值,如果我們不傳遞分頁的信息,那么它將默認每頁的大小size為15,頁數(shù)page為第三頁,分類的方式是使用username,采用asc升序的方式排列。

解釋完上面的代碼我們就可以開始測試,相信大家都知道,后臺開發(fā)就頭疼的就是測試,你每次測試都要啟動服務器,這樣很浪費時間,不過在這里我們可以采用spring提供的測試的平臺,我們就可以不用每次去啟動服務器了,哈哈哈,體會到了spring的強大之處了吧。話不多說,先看代碼。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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里的偏好設(shè)置中設(shè)置了這幾個類,所以可以自動引入其靜態(tài)方法
    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這個路徑下去創(chuàng)建這個類,@Before這個注解是前置聲明,表示每次測試之前都會先執(zhí)行這段代碼,在這里,我們創(chuàng)建了mockMvc這個來,這是spring提供的一種測試類,讀者可以去查查其API,這里不做詳細介紹了。

?
1
2
3
4
//   mockMvc.perform(MockMvcRequestBuilders.get("/user")
//   .contentType(MediaType.APPLICATION_JSON_UTF8))
//   .andExpect(MockMvcResultMatchers.status().isOk())
//   .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));

這里,介紹一下這段注釋掉的代碼,和下面的那段代碼作用相同,不過下面的代碼更加簡潔,我們可以在eclipse中的偏好設(shè)置favorite中設(shè)置MockMvcRequestBuilders,MockMvcResultMatchers這兩個類型的設(shè)置,這樣就可以化簡代碼,eclipse將會自動加入其靜態(tài)方法,這里讀者可能看不出來是什么意思,自己試一下就會感受到了,不會的可以留言哈。

?
1
2
3
4
5
6
7
8
9
10
11
12
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));

最后,上面的代碼時我們測試的參數(shù),比如username,age,還有分頁的信息等等,這類似與我們前臺URL或者表單中提交到后臺的參數(shù)。這里還有一點要介紹的是.andExpect(jsonPath(“$.length()”).value(3)),這段代碼表示前臺期望返回的是一個json格式的數(shù)據(jù)其長度為3,這種寫法讀者可以去github上搜索jsonPath這個關(guān)鍵字,上面有官方的詳細介紹文檔。

最后我們啟動程序,看控制臺輸出的結(jié)果,下面是控制臺打印的主要信息。怎么樣,是不是感受到了restful的風格,自己動手試試會更加深有體會。

?
1
2
3
4
5
6
7
8
9
15
3
age: DESC
cn.shinelon.vo.UserQueryCondition@ee96866[
 username=shinelon
 sex=male
 age=18
 address=北京市
]

總結(jié)

以上就是本文關(guān)于SpringMVC開發(fā)restful API之用戶查詢代碼詳解的全部內(nèi)容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/qq_37142346/article/details/78386245

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 狠狠色成人综合网图片区 | 万域之王在线观看 | 亚洲国产欧美在线看片 | 国产精品反差婊在线观看 | 美女张开腿让男人桶的 视频 | 日本天堂视频在线观看 | 色呦阁 | 久久re热在线视频精99 | 久久国产精品人妻中文 | 精品欧美小视频在线观看 | 欧美成人乱弄视频 | 国产裸露片段精华合集链接 | 男同gay玩奴男同玩奴 | 女人和男人搞基 | 国内免费高清视频在线观看 | 亚洲成人福利 | 九九精品免费视频 | 青青草99| 超级乱淫伦短篇小说做车 | 欧美日韩视频在线成人 | 国产日韩欧美精品在线 | 欧美高清乌克兰精品另类 | 成人久久18免费网站 | 视频一区二区国产无限在线观看 | 亚洲国产成人综合 | 成年极品漫画在线观看 | 亚洲国产日韩成人综合天堂 | 亚洲免费视频一区二区三区 | 粉嫩极品国产在线观看免费 | 秋霞综合网 | 538亚洲欧美国产日韩在线精品 | 精品一区二区三区免费观看 | 亚洲一成人毛片 | 亚洲成在人网站天堂一区二区 | 四虎2020紧急免费入口 | 国产亚洲精品第一综合另类 | 99视频免费在线 | 放荡护士玩3p口述 | 视频高清在线观看 | 娇小老少配xxxxx性视频 | 国产一区在线免费观看 |