https://blog.csdn.net/hjc1984117/article/details/77334616
1、何為RESTful API
RESTful API就是REST風格的API,即前端接收到的用戶請求統一由一個后臺來處理并返回給不同的前端。
RESTful API的設計原則和規范(可以認為是相關術語的解釋)
資源:文本可以用TXT,也可以用HTML或者XML、圖片可以用JPG格式或者PNG格式,JSON是現在最常用的資源表現形式。
-
統一接口:數據元操CRUD(create,read,update,delete)分別對應HTTP方法:
GET
用來獲取資源,POST
用來新建資源(也可以用于更新資源),PUT
用來更新資源,DELETE
用來刪除資源。
構建規則 URI:可以用一個URI(統一資源定位符)指向資源,即每個URI都對應一個特定的資源。要獲取這個資源訪問它的URI就可以,因此URI就成了每一個資源的地址或識別符。一般的,每個資源至少有一個URI與之對應,最典型的URI就是URL。
無狀態:例如要查詢員工工資的步驟為第一步:登錄系統。第二步:進入查詢工資的頁面。第三步:搜索該員工。第四步:點擊姓名查看工資。這樣的操作流程就是有狀態的,查詢工資的每一個步驟都依賴于前一個步驟,只要前置操作不成功,后續操作就無法執行。如果輸入一個URL就可以得到指定員工的工資,則這種情況就是無狀態的,因為獲取工資不依賴于其他資源或狀態,且這種情況下,員工工資是一個資源,如果由一個URL與之對應可以通過HTTP中的GET方法得到資源,這就是典型的RESTful風格。
2、開始構建
@RestController
@RequestMapping(value="/users") // 通過這里配置使下面的映射都在/users下
public class UserController {
// 創建線程安全的Map
static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());
@RequestMapping(value="/", method=RequestMethod.GET)
public List<User> getUserList() {
// 處理"/users/"的GET請求,用來獲取用戶列表
// 還可以通過@RequestParam從頁面中傳遞參數來進行查詢條件或者翻頁信息的傳遞
List<User> r = new ArrayList<User>(users.values());
return r;
}
@RequestMapping(value="/", method=RequestMethod.POST)
public String postUser(@ModelAttribute User user) {
// 處理"/users/"的POST請求,用來創建User
// 除了@ModelAttribute綁定參數之外,還可以通過@RequestParam從頁面中傳遞參數
users.put(user.getId(), user);
return "success";
}
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public User getUser(@PathVariable Long id) {
// 處理"/users/{id}"的GET請求,用來獲取url中id值的User信息
// url中的id可通過@PathVariable綁定到函數的參數中
return users.get(id);
}
@RequestMapping(value="/{id}", method=RequestMethod.PUT)
public String putUser(@PathVariable Long id, @ModelAttribute User user) {
// 處理"/users/{id}"的PUT請求,用來更新User信息
User u = users.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
users.put(id, u);
return "success";
}
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public String deleteUser(@PathVariable Long id) {
// 處理"/users/{id}"的DELETE請求,用來刪除User
users.remove(id);
return "success";
}
}
下面針對該Controller編寫測試用例驗證正確性,具體如下。當然也可以通過瀏覽器插件等進行請求提交驗證:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MockServletContext.class)
@WebAppConfiguration
public class ApplicationTests {
private MockMvc mvc;
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
}
@Test
public void testUserController() throws Exception {
// 測試UserController
RequestBuilder request = null;
// 1、get查一下user列表,應該為空
request = get("/users/");
mvc.perform(request)
.andExpect(status().isOk())
.andExpect(content().string(equalTo("[]")));
// 2、post提交一個user
request = post("/users/")
.param("id", "1")
.param("name", "測試大師")
.param("age", "20");
mvc.perform(request)
.andExpect(content().string(equalTo("success")));
// 3、get獲取user列表,應該有剛才插入的數據
request = get("/users/");
mvc.perform(request)
.andExpect(status().isOk())
.andExpect(content().string(equalTo("[{\"id\":1,\"name\":\"測試大師\",\"age\":20}]")));
// 4、put修改id為1的user
request = put("/users/1")
.param("name", "測試終極大師")
.param("age", "30");
mvc.perform(request)
.andExpect(content().string(equalTo("success")));
// 5、get一個id為1的user
request = get("/users/1");
mvc.perform(request)
.andExpect(content().string(equalTo("{\"id\":1,\"name\":\"測試終極大師\",\"age\":30}")));
// 6、del刪除id為1的user
request = delete("/users/1");
mvc.perform(request)
.andExpect(content().string(equalTo("success")));
// 7、get查一下user列表,應該為空
request = get("/users/");
mvc.perform(request)
.andExpect(status().isOk())
.andExpect(content().string(equalTo("[]")));
}
}
- 這里是使用
MockMvc
來模擬請求
-
附錄:SpringBoot 中常用注解@Controller/@RestController/@RequestMapping介紹
https://blog.csdn.net/u010412719/article/details/69710480
還參考了:
http://blog.didispace.com/springbootrestfulapi/
https://blog.csdn.net/u010412719/article/details/69710480
這里注意使用@Controller 處理http請求還需要在pom.xml文件中添加模板依賴
@RestController與@Controller的區別:@RestController集成了多個其他的注解`