Spring Security入门(四) 使用Spring MVC开发RESTful API-查询请求

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33248299/article/details/89324471

一.导学

  • 编写第一个Restful Api
    • 编写针对RestfulAPI的测试用例
    • 使用注解声明RestfulAPI
    • 在RestfulAPI中传递参数
  • 常用注解
RestController 标明此Controller提供RestAPI
RequestMapping及变体。映射http请求url到java方法
RequestParam 映射请求参数到java方法的参数
PageableDefault 指定分页参数的默认值
  • 先引入spring测试依赖
    在这里插入图片描述

二.编写测试用例

1.编写类
@RunWith(SpringRunner.class)//由springRunner来运行这个测试类
@SpringBootTest//申明为SpringBoot测试类
public class UserControllerTest {
   
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {
    @Autowired
    private WebApplicationContext wac;
    
	// 伪造的mvc不会真正去启动项目
    // 相对来说会比直接启用项目要快
    private MockMvc mockMvc;

    @Before//在所有测试用例执行之前执行
    public void setup(){
          mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }


}

2.编写一个查询用户的测试用例
 @Test
    public void whenQuerySuccess() throws Exception{
         mockMvc.perform(MockMvcRequestBuilders.get("/user")  // 发起请求
                .contentType(MediaType.APPLICATION_JSON_UTF8)) //添加请求头为json
                 .andExpect(MockMvcResultMatchers.status().isOk()) //期望返回码为200
                 .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));//期望返回集合长度为3
    }
3.关于jsonPath
4.编写一个RESTful API
@RestController
public class UserController {

    @RequestMapping(value="/user",method = RequestMethod.GET)
    public List<User> query(@RequestParam String username){//传过来参数必须要username
        System.out.println(username);
         List<User> list = new ArrayList<>();
         list.add(new User());
         list.add(new User());
         list.add(new User());
         return list;
    }
}
public class User {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

在这里插入图片描述

  • 一般查询都是有条件的,根据username来查之类的
5.带参
@RestController
public class UserController {

    @RequestMapping(value="/user",method = RequestMethod.GET)
    public List<User> query(@RequestParam String username){//传过来参数必须要username
        System.out.println(username);
         List<User> list = new ArrayList<>();
         list.add(new User());
         list.add(new User());
         list.add(new User());
         return list;
    }
}
  • 如果不带这个参数就会出现这种情况
    在这里插入图片描述
 @Test
    public void whenQuerySuccess() throws Exception{
         mockMvc.perform(MockMvcRequestBuilders.get("/user")
                 .param("username","tang")
                .contentType(MediaType.APPLICATION_JSON_UTF8))
                 .andExpect(MockMvcResultMatchers.status().isOk())
                 .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
    }
6.@RequestParam 注解说明
@RequestParam(required = true,name = "xxx",defaultValue=“tom”) String username
上面的注解作用是:username(名字可以任意,但是name属性必须和前端传递参数名一致) required是否必须要
当前端没传递名为xxx过来时,默认xxx的值为tom
7.多条件查询
  • 查询条件过多 参数写一起不好看的 可以整合到一个对象中
public class UserQueryCondition {
    private String username;

    private int age;

    private int ageTo;

    private String xxx;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAgeTo() {
        return ageTo;
    }

    public void setAgeTo(int ageTo) {
        this.ageTo = ageTo;
    }

    public String getXxx() {
        return xxx;
    }

    public void setXxx(String xxx) {
        this.xxx = xxx;
    }
}

@RequestMapping(value="/user",method = RequestMethod.GET)
    public List<User> query(UserQueryCondition condition){
        System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));
         List<User> list = new ArrayList<>();
         list.add(new User());
         list.add(new User());
         list.add(new User());
         return list;
    }
 @Test
    public void whenQuerySuccess() throws Exception{
         mockMvc.perform(MockMvcRequestBuilders.get("/user")
                 .param("username","123")
                 .param("age","20")
                 .param("ageTo","70")
                 .param("xxx","xxx")
                .contentType(MediaType.APPLICATION_JSON_UTF8))
                 .andExpect(MockMvcResultMatchers.status().isOk())
                 .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
    }

在这里插入图片描述

8.PageableDefault注解
@Test
    public void whenQuerySuccess() throws Exception{
         mockMvc.perform(MockMvcRequestBuilders.get("/user")
                 .param("username","123")
                 .param("age","20")
                 .param("ageTo","70")
                 .param("xxx","xxx")
                 .param("size","15")
                 .param("page","3")
                 .param("sort","age,desc")
                .contentType(MediaType.APPLICATION_JSON_UTF8))
                 .andExpect(MockMvcResultMatchers.status().isOk())
                 .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
    }
@RequestMapping(value="/user",method = RequestMethod.GET)
    public List<User> query(UserQueryCondition condition, @PageableDefault Pageable pageable){
        System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));

        System.out.println(pageable.getPageSize());//每页返回几条
        System.out.println(pageable.getPageNumber());//查第几页数据
        System.out.println(pageable.getSort());//排序方式

         List<User> list = new ArrayList<>();
         list.add(new User());
         list.add(new User());
         list.add(new User());
         return list;
    }

在这里插入图片描述

  • 也是可以设置默认值的
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_33248299/article/details/89324471