RESTful API和传统API的区别:
1.1、用URL描述资源:
传统的请求用url来描述你的行为,比如/user/query?
name=xiaoming,看这个url就知道我们是要针对这个叫小明的用户进行一个查询,那么查询就是我们要进行的行为。而Restful API则是用来描述资源,比如/user/1,他既是一个查询,又是一个删除,而这个1呢就是我们用户ID为1的用户资源。
1.2、RESTful API 使用HTTP方法来描述行为。使用HTTP状态码来表示不同的结果:
RESTful API 使用GET、POST、PUT、DELETE来表述行为,比如GET就是一个获取资源的行为,POST、PUT就是增加和修改资源的行为,而DELETE则是删除资源的行为。在我们以前的传统的写法里面一个请求发出去以后,请求成功后返回200,然后会将返回的结果封装成一个JSON,请求失败了还是返回的200,具体的成功与非的判断要解析JSON后判断后才能确定到底是不是请求成功了,就跟根据我们返回的报文里的内容来判断是否成功。
1.3、使用JSON交互数据:
RESTful API 的请求和返回都是通过JSON格式进行的。
1.4、RESTful 只是一种风格,并不是强制的标准。
REST成熟度模型:
0级: 使用Http作为传输方式。
1级: 引入资源概念。每个资源都有对应的URL。
2级: 使用HTTP方法进行不同的操作。使用HTTP状态码来表示不同的结果。
3级: 使用超媒体。在资源的表达中包含了链接信息。
编写针对RestfulAPI的测试用例
//如何来运行测试用例?使用SpringRunner.class
@RunWith(SpringRunner.class)
//说明这是一个Spring boot 的测试用力
@SpringBootTest
public class UserControllerTest {
//伪造的mvc环境,这样就不会启动tomcat也可以使用
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
//在测试用例之前执行
@Before
public void setup() {
//MockMvcBuilders.webAppContextSetup(WebApplicationContext context)
//执行WebApplicationContext,将会从上下文获取相应的控制器并得到相应的MockMvc
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void whenQuerySuccess() throws Exception {
//MockMvc调用perform,执行一个RequestBuilder请求,调用controller的业务逻辑
mockMvc.perform(MockMvcRequestBuilders.get("/user")
.param("userName", "Ni Hao!") //User对象中的参数
.param("userAge", "12") //User对象中的参数
.param("userId", "1") //User对象中的参数
.param("name","test") //UserQueryDto对象中的参数
.param("age", "23")//UserQueryDto对象中的参数
.param("sex","2").//UserQueryDto对象中的参数
//MediaType.APPLICATION_JSON_UTF8 = application/json;charset=UTF-8
contentType(MediaType.APPLICATION_JSON_UTF8)).
//andExpect() 对请求的期望,返回的状态码是200
andExpect(MockMvcResultMatchers.status().isOk()).
//返回的集合里包含了三个user对象.
andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
}
}
需要测试controller
@RestController
public class UserController {
@RequestMapping(value = "/user", method = RequestMethod.GET)
public List<User> query(UserQueryDto queryDto, User user) {
System.out.println(ReflectionToStringBuilder.toString(queryDto, ToStringStyle.DEFAULT_STYLE));
System.out.println(ReflectionToStringBuilder.toString(user, ToStringStyle.DEFAULT_STYLE));
List<User> users = new ArrayList<>();
users.add(new User());
users.add(new User());
users.add(new User());
return users;
}
}
输出结果
com.fuiou.dto.UserQueryDto@5ca4dce5[name=test,age=23,sex=2]
com.fuiou.dto.User@40bd0f8[userId=1,userName=Ni Hao!,userAge=12]
有哪些注解可以配合 RESTful API :
@RestController 返回给浏览器一个对象
@RequestMapping 访问路径 value放路径 method放请求方式
@RequestBody 将传递的JSON转换为自己需要的对象
@PathVariable 获取url中的参数