首先我們來了解一下RESTful API
請求類型 | URL | 功能說明 |
---|---|---|
GET | /users | 查詢用戶列表 |
POST | /users | 創建一個用戶 |
PUT | /users/id | 根據id修改一個用戶 |
DELETE | /users/id | 根據id刪除一個用戶 |
主要是用Spring MVC來實現一組對User對象操作的RESTful API,配合註釋詳細說明在Spring MVC中如何映射HTTP請求、如何傳參、如何編寫單元測試。
項目結構
User實體類
public class UserPojo {
private String id;
private String name;
private String happay;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHappay() {
return happay;
}
public void setHappay(String happay) {
this.happay = happay;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
Conntroller層類
@RestController/** 默認放回json數據格式,替換ReposeBody*/
@RequestMapping(value = "/user")
public class UserController {
//創建線程安全的map
static Map< String, UserPojo> map = Collections.synchronizedMap( new HashMap<String,UserPojo>());
/**
* 處理”/user的get請求,用來獲取用戶列表
* @return
*/
@RequestMapping(value = "/",method = RequestMethod.GET )
public List<UserPojo> getUser(){
List<UserPojo> listUser = new ArrayList<UserPojo>(map.values());
return listUser;
}
/**
* 處理”/user的post請求,新增用戶
* @param userPojo
* @return
*/
@RequestMapping(value = "/",method = RequestMethod.POST)
public String postUser(@ModelAttribute UserPojo userPojo){
//
// 除了modelAttribute 綁定參數外還可以用@RequestParam從頁面傳遞參數
map.put(userPojo.getId(),userPojo);
return "success";
}
/**
* 根據id來查詢用戶信息
* 處理"/users/{id}"的GET請求,用來獲取url中id值的User信息
* @param id
* @return
*/
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public UserPojo getByUserId(@PathVariable String id){
// url中的id可通過@PathVariable綁定到函數的參數中
return map.get(id);
}
/**
* 根據id來修改用戶信息
* @param id
* @param userPojo
* @return
*/
@RequestMapping(value = "/{id}",method = RequestMethod.PUT)
public String putByIdUser(@PathVariable String id,@ModelAttribute UserPojo userPojo){
// 處理"/users/{id}"的PUT請求,用來更新User信息
UserPojo userPojo1 = new UserPojo();
userPojo1.setName(userPojo.getName());
userPojo1.setHappay(userPojo.getHappay());
map.put(id,userPojo1);
return "success";
}
/**
* 處理"/users/{id}"的DELETE請求,用來刪除User
* @param id
* @return
*/
@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
public String deleteByIdUser(@PathVariable String id){
map.remove(id);
return "success";
}
}
測試結果
下面針對該Controller編寫測試用例驗證正確性,具體如下。當然也可以通過瀏覽器插件等進行請求提交驗證。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTests {
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
}
@Test
public void testUserController() throws Exception {
RequestBuilder requestBuilder = null;
//get用戶列表應該爲空
requestBuilder = get("/user/");
mockMvc.perform(requestBuilder)
.andExpect(status().isOk())
.andExpect(content().string(equalTo("[]")));
//新增一個用戶期待應該是success
requestBuilder = post("/user/")
.param("id","1")
.param("name","wusha")
.param("happay","basketball");
mockMvc.perform(requestBuilder)
.andExpect(content().string(equalTo("success")));
//get用戶列表剛剛新增的數據
requestBuilder = get("/user/");
mockMvc.perform(requestBuilder)
.andExpect(status().isOk())
.andExpect(content().string(equalTo("[{\"id\":\"1\",\"name\":\"wusha\",\"happay\":\"basketball\"}]")));
//根據id來查找用戶信息
requestBuilder = get("/user/1");
mockMvc.perform(requestBuilder)
.andExpect(content().string(equalTo("{\"id\":\"1\",\"name\":\"wusha\",\"happay\":\"basketball\"}")));
//根據id來修改用戶信息
requestBuilder = put("/user/1")
.param("name","shasha")
.param("happay","football");
mockMvc.perform(requestBuilder)
.andExpect(content().string(equalTo("success")));
//根據id來刪除用戶信息
requestBuilder = delete("/user/1");
mockMvc.perform(requestBuilder)
.andExpect(content().string(equalTo("success")));
}
}
註解
最後再來複習一下springMVC的常用註解也就是我項目中用到的
-
@Controller:修飾class,用來創建處理http請求的對象
-
@RestController:Spring4之後加入的註解,原來在@Controller中返回json需要@ResponseBody來配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默認返回json格式。
-
@RequestMapping:配置url映射
參數綁定的註解
- @PathVariable是 映射 URL 綁定的佔位符,通過 @PathVariable 可以將 URL 中佔位符參數綁定到控制器處理方法的入參中:URL 中的 {xxx} 佔位符可以通過@PathVariable(“xxx“) 綁定到操作方法的入參中。
- @ModelAttribute,運用在參數上,會將客戶端傳遞過來的參數按名稱注入到指定對象中,並且會將這個對象自動加入ModelMap中,便於View層使用;
運用在方法上,會在每一個@RequestMapping標註的方法前執行,如果有返回值,則自動將該返回值加入到ModelMap中; - @RequestParam,主要用於將請求參數區域的數據映射到控制層方法的參數上