003 使用SpringMVC开发restful API

一:介绍说明

1.介绍

  

2.restful api的成熟度

  

二:编写Restful API的测试用例

1.引入spring的测试框架

  在effective pom中查找

  

2.新建测试包,测试类

  

3.测试用例程序

 1 package com.cao.web.controller;
 2
 3 import org.junit.Before;
 4 import org.junit.Test;
 5 import org.junit.runner.RunWith;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.boot.test.context.SpringBootTest;
 8 import org.springframework.http.MediaType;
 9 import org.springframework.test.context.junit4.SpringRunner;
10 import org.springframework.test.web.servlet.MockMvc;
11 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
12 import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
13 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
14 import org.springframework.web.context.WebApplicationContext;
15
16 //如何运行测试用例
17 @RunWith(SpringRunner.class)
18 //这是一个测试用例
19 @SpringBootTest
20 public class UserControllerTest {
21     //伪造测试用例,不需要跑tomcat,运行会很快
22     @Autowired
23     private WebApplicationContext wac;
24
25     //伪造的一个mvc环境
26     private MockMvc mockMvc;
27
28     @Before
29     public void setup() {
30         //初始化这个环境
31         mockMvc=MockMvcBuilders.webAppContextSetup(wac).build();
32     }
33
34     @Test
35     public void whenQuerySuccess() throws Exception {
36         //发送请求
37         mockMvc.perform(MockMvcRequestBuilders.get("/user")
38                 .contentType(MediaType.APPLICATION_JSON_UTF8))
39             .andExpect(MockMvcResultMatchers.status().isOk())
40             .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
41     }
46
47 }

4.执行效果

  

三:使用注解声明RestfulAPI

1.常用注解

  @RestController标明此controller提供RestAPI

  @RequestMapping及其变体,映射url到java

  @RequestParam映射请求参数到java方法上的参数、

  @PageableDefault指定分页参数默认值

[email protected]与@RequestMapping小测试

  控制类

 1 package com.cao.web.controller;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import org.springframework.web.bind.annotation.RequestMapping;
 7 import org.springframework.web.bind.annotation.RequestMethod;
 8 import org.springframework.web.bind.annotation.RestController;
 9
10 import com.cao.dto.User;
11
12 //此controller可以提供restful服务
13 @RestController
14 public class UserController {
15     @RequestMapping(value="/user",method=RequestMethod.GET)
16     public List<User> query(){
17         List<User> userList=new ArrayList<>();
18         userList.add(new User());
19         userList.add(new User());
20         userList.add(new User());
21         return userList;
22     }
23
24 }

  User.java

    新建dto包

 1 package com.cao.dto;
 2
 3 public class User {
 4     private String username;
 5     private String password;
 6
 7     public String getUsername() {
 8         return username;
 9     }
10     public void setUsername(String username) {
11         this.username = username;
12     }
13     public String getPassword() {
14         return password;
15     }
16     public void setPassword(String password) {
17         this.password = password;
18     }
19
20 }

3.效果

   说明,服务已经建立起来了。

   

[email protected]小测试【单个参数】

  常规的用法

    测试类

 1 package com.cao.web.controller;
 2
 3 import org.junit.Before;
 4 import org.junit.Test;
 5 import org.junit.runner.RunWith;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.boot.test.context.SpringBootTest;
 8 import org.springframework.http.MediaType;
 9 import org.springframework.test.context.junit4.SpringRunner;
10 import org.springframework.test.web.servlet.MockMvc;
11 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
12 import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
13 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
14 import org.springframework.web.context.WebApplicationContext;
15
16 //如何运行测试用例
17 @RunWith(SpringRunner.class)
18 //这是一个测试用例
19 @SpringBootTest
20 public class UserControllerTest {
21     //伪造测试用例,不需要跑tomcat,运行会很快
22     @Autowired
23     private WebApplicationContext wac;
24
25     //伪造的一个mvc环境
26     private MockMvc mockMvc;
27
28     @Before
29     public void setup() {
30         //初始化这个环境
31         mockMvc=MockMvcBuilders.webAppContextSetup(wac).build();
32     }
33
34     @Test
35     public void whenQuerySuccess() throws Exception {
36         //发送请求
37         mockMvc.perform(MockMvcRequestBuilders.get("/user")
38                 .param("username", "Job")
39                 .contentType(MediaType.APPLICATION_JSON_UTF8))
40             .andExpect(MockMvcResultMatchers.status().isOk())
41             .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
42     }
43
44
45 }

  控制类

 1 package com.cao.web.controller;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import org.springframework.web.bind.annotation.RequestMapping;
 7 import org.springframework.web.bind.annotation.RequestMethod;
 8 import org.springframework.web.bind.annotation.RequestParam;
 9 import org.springframework.web.bind.annotation.RestController;
10
11 import com.cao.dto.User;
12
13 //此controller可以提供restful服务
14 @RestController
15 public class UserController {
16     @RequestMapping(value="/user",method=RequestMethod.GET)
17     public List<User> query(@RequestParam String username){
18         List<User> userList=new ArrayList<>();
19         System.out.println("username="+username);
20         userList.add(new User());
21         userList.add(new User());
22         userList.add(new User());
23         return userList;
24     }
25
26 }

  RequestParam的其他参数

  

 1 package com.cao.web.controller;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import org.springframework.web.bind.annotation.RequestMapping;
 7 import org.springframework.web.bind.annotation.RequestMethod;
 8 import org.springframework.web.bind.annotation.RequestParam;
 9 import org.springframework.web.bind.annotation.RestController;
10
11 import com.cao.dto.User;
12
13 //此controller可以提供restful服务
14 @RestController
15 public class UserController {
16     @RequestMapping(value="/user",method=RequestMethod.GET)
17     public List<User> query(@RequestParam(name="username",required=false,defaultValue="Tom") String name){
18         List<User> userList=new ArrayList<>();
19         System.out.println("name="+name);
20         userList.add(new User());
21         userList.add(new User());
22         userList.add(new User());
23         return userList;
24     }
25
26 }

  这里主要是要注意一下别名。

5.使用类组装多个参数【多个参数进行传递】

  这里主要是说上面的RequestParam不再满足的时候,主要的场景是复杂的多请求参数时

  测试类

 1 package com.cao.web.controller;
 2
 3 import org.junit.Before;
 4 import org.junit.Test;
 5 import org.junit.runner.RunWith;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.boot.test.context.SpringBootTest;
 8 import org.springframework.http.MediaType;
 9 import org.springframework.test.context.junit4.SpringRunner;
10 import org.springframework.test.web.servlet.MockMvc;
11 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
12 import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
13 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
14 import org.springframework.web.context.WebApplicationContext;
15
16 //如何运行测试用例
17 @RunWith(SpringRunner.class)
18 //这是一个测试用例
19 @SpringBootTest
20 public class UserControllerTest {
21     //伪造测试用例,不需要跑tomcat,运行会很快
22     @Autowired
23     private WebApplicationContext wac;
24
25     //伪造的一个mvc环境
26     private MockMvc mockMvc;
27
28     @Before
29     public void setup() {
30         //初始化这个环境
31         mockMvc=MockMvcBuilders.webAppContextSetup(wac).build();
32     }
33
34     @Test
35     public void whenQuerySuccess() throws Exception {
36         //发送请求
37         mockMvc.perform(MockMvcRequestBuilders.get("/user")
38                 .param("username", "Job")
39                 .param("age", "18")
40                 .param("xxx", "XXX")
41                 .contentType(MediaType.APPLICATION_JSON_UTF8))
42             .andExpect(MockMvcResultMatchers.status().isOk())
43             .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
44     }
45
46
47 }

  控制类

 1 package com.cao.web.controller;
 2
 3 import static org.mockito.Matchers.contains;
 4
 5 import java.util.ArrayList;
 6 import java.util.List;
 7
 8 import org.apache.commons.lang.builder.ReflectionToStringBuilder;
 9 import org.apache.commons.lang.builder.ToStringStyle;
10 import org.springframework.web.bind.annotation.RequestMapping;
11 import org.springframework.web.bind.annotation.RequestMethod;
12 import org.springframework.web.bind.annotation.RequestParam;
13 import org.springframework.web.bind.annotation.RestController;
14
15 import com.cao.dto.User;
16 import com.cao.dto.UserQueryCondition;
17
18 //此controller可以提供restful服务
19 @RestController
20 public class UserController {
21     @RequestMapping(value="/user",method=RequestMethod.GET)
22     public List<User> query(UserQueryCondition condition){
23         //反射的方法来打印
24         System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));
25         //
26         List<User> userList=new ArrayList<>();
27         userList.add(new User());
28         userList.add(new User());
29         userList.add(new User());
30         return userList;
31     }
32
33 }

  UserQueryCondition.java

 1 package com.cao.dto;
 2
 3 public class UserQueryCondition {
 4     private String username;
 5     private int age;
 6     private int ageTo;
 7     private String xxx;
 8     public String getUsername() {
 9         return username;
10     }
11     public void setUsername(String username) {
12         this.username = username;
13     }
14     public int getAge() {
15         return age;
16     }
17     public void setAge(int age) {
18         this.age = age;
19     }
20     public int getAgeTo() {
21         return ageTo;
22     }
23     public void setAgeTo(int ageTo) {
24         this.ageTo = ageTo;
25     }
26     public String getXxx() {
27         return xxx;
28     }
29     public void setXxx(String xxx) {
30         this.xxx = xxx;
31     }
32
33 }

  效果

  

[email protected]

  测试类

 1 package com.cao.web.controller;
 2
 3 import org.junit.Before;
 4 import org.junit.Test;
 5 import org.junit.runner.RunWith;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.boot.test.context.SpringBootTest;
 8 import org.springframework.http.MediaType;
 9 import org.springframework.test.context.junit4.SpringRunner;
10 import org.springframework.test.web.servlet.MockMvc;
11 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
12 import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
13 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
14 import org.springframework.web.context.WebApplicationContext;
15
16 //如何运行测试用例
17 @RunWith(SpringRunner.class)
18 //这是一个测试用例
19 @SpringBootTest
20 public class UserControllerTest {
21     //伪造测试用例,不需要跑tomcat,运行会很快
22     @Autowired
23     private WebApplicationContext wac;
24
25     //伪造的一个mvc环境
26     private MockMvc mockMvc;
27
28     @Before
29     public void setup() {
30         //初始化这个环境
31         mockMvc=MockMvcBuilders.webAppContextSetup(wac).build();
32     }
33
34     @Test
35     public void whenQuerySuccess() throws Exception {
36         //发送请求
37         mockMvc.perform(MockMvcRequestBuilders.get("/user")
38                 .param("username", "Job")
39                 .param("age", "18")
40                 .param("xxx", "XXX")
41                 //分页,查第三页,每页15条,按照age降序
42                 .param("page", "3")
43                 .param("size", "15")
44                 .param("sort", "age,desc")
45                 //
46                 .contentType(MediaType.APPLICATION_JSON_UTF8))
47             .andExpect(MockMvcResultMatchers.status().isOk())
48             .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
49     }
50
51
52 }

  控制类

 1 package com.cao.web.controller;
 2
 3 import static org.mockito.Matchers.contains;
 4
 5 import java.util.ArrayList;
 6 import java.util.List;
 7
 8 import org.apache.commons.lang.builder.ReflectionToStringBuilder;
 9 import org.apache.commons.lang.builder.ToStringStyle;
10 import org.springframework.data.domain.Pageable;
11 import org.springframework.data.web.PageableDefault;
12 import org.springframework.web.bind.annotation.RequestMapping;
13 import org.springframework.web.bind.annotation.RequestMethod;
14 import org.springframework.web.bind.annotation.RequestParam;
15 import org.springframework.web.bind.annotation.RestController;
16
17 import com.cao.dto.User;
18 import com.cao.dto.UserQueryCondition;
19
20 //此controller可以提供restful服务
21 @RestController
22 public class UserController {
23     @RequestMapping(value="/user",method=RequestMethod.GET)
24     public List<User> query(UserQueryCondition condition,@PageableDefault(size=13) Pageable pageable){
25         //反射的方法来打印
26         System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));
27         //
28         System.out.println(pageable.getPageSize());
29         System.out.println(pageable.getPageNumber());
30         System.out.println(pageable.getSort());
31         //
32         List<User> userList=new ArrayList<>();
33         userList.add(new User());
34         userList.add(new User());
35         userList.add(new User());
36         return userList;
37     }
38
39 }

  效果

  

原文地址:https://www.cnblogs.com/juncaoit/p/9697096.html

时间: 2024-10-28 15:27:29

003 使用SpringMVC开发restful API的相关文章

使用SpringMVC开发Restful API(2)-使用Filter、Interceptor对请求进行拦截和处理拦截顺序

一 使用Filter拦截请求: 1.使用Filter拦截只需要我们定义一个类并实现javax.servlet.Filter接口,然后将其注册为bean即可. 示例: import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; im

004 使用SpringMVC开发restful API二

一:编写用户详情服务 1.任务 @PathVariable隐射url片段到java方法的参数 在url声明中使用正则表达式 @JsonView控制json输出内容 二:@PathVariable [email protected]小测试 测试类 1 @Test 2 public void whenGetInfoSuccess() throws Exception { 3 //发送请求 4 mockMvc.perform(MockMvcRequestBuilders.get("/user/1&qu

005 使用SpringMVC开发restful API二--处理创建请求

一:主要任务 1.说明 @RequestBody 映射请求体到java方法的参数 日期类型参数的处理 @Valid注解 BindingResult验证请求参数的合法性并处理校验结果 二:@RequestBody [email protected] 测试类 1 /** 2 * @throws Exception 3 * 4 */ 5 @Test 6 public void whenCreateSuccess() throws Exception { 7 String content="{\&quo

006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义

一:任务 1.任务 常用的验证注解 自定义返回消息 自定义校验注解 二:Hibernate Validator 1.常见的校验注解 2.程序 测试类 1 /** 2 * @throws Exception 3 * 更新程序,主要是校验程序的验证 4 * 5 */ 6 @Test 7 public void whenUpdateSuccess() throws Exception { 8 //JDK1.8的特性 9 Date date=new Date(LocalDateTime.now().pl

flask开发restful api

在此之前,向大家说明的是,我们整个框架用的是flask + sqlalchemy + redis.如果没有开发过web,还是先去学习一下,这边只是介绍如果从开发web转换到开发移动端.如果flask还不是很熟悉,我建议先到这个网站简单学习一下,非常非常简单.http://dormousehole.readthedocs.org/en/latest/ 一直想写一些特别的东西,能让大家学习讨论的东西.但目前网上的很多博客,老么就按照官方文档照本宣读,要么直接搬代码,什么都不说明.我写这个系列的博客,

开发restful api总结的几点小经验

与其说是开发,不如说是打补丁! 是个jesery+spring的restful service,加了一个权限校验部分,做了一些调整. 本来其实很简单的一个事,后来发现,这个代码太霸道.本来传个参数是action_id 这个东西,结果参数名字有如下:action_id,actionID,id 我只能说傻傻分不清楚到底你传的什么, 因为还有其他id,参数名字参考刚才的. 代码中的也是混乱,虽然我知道有很多先人在修改了,但是也不至于这样吧. 吐槽完毕. 1.N次开发restful api主意版本迭代,

SwaggerUI+SpringMVC——构建RestFul API的可视化界面

今天给大家介绍一款工具,这个工具目前可预见的好处是:自动维护最新的接口文档. 我们都知道,接口文档是非常重要的,但是随着代码的不断更新,文档却很难持续跟着更新,今天要介绍的工具,完美的解决了这个问题.而且,对于要使用我们接口的人来说,不需要在给他提供文档,告诉他地址,一目了然. 最近项目中一直有跟接口打交道,恰好又接触到了一个新的接口工具,拿出来跟大家分享一下. 关于REST接口,我在上篇文章中已经有介绍,这里来说一下如何配合SwaggerUI搭建RestFul API 的可视化界面.最终要达到

flask开发restful api系列(7)-蓝图与项目结构

如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而对整个项目来说,总要有后台管理系统吧,总要有web管理吧,但这些东西不能全部放到view.py.不单单是这样,如果你是一个经验丰富的程序员,你应该知道,一个程序最好只有一个入口点,从这个入口点进去,全是单向的,就像一棵树一样,入口点就在树根,然后蔓延到树干,树枝.树枝和树枝之间最好不要太多交集,也就

ASP.NET Core Web API 开发-RESTful API实现

REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representational State Transfer,简称REST)是Roy Thomas Fielding博士于2000年在他的博士论文 "Architectural Styles and the Design of Network-based Software Architectures" 中提出来的一种万维网软件架构风格. 目前在三种主流的Web服务实现方案中,因为R