1.SpringMVC快速使用
1.基于restful http接口 的CURD
1
2 /***
3 * @Author 徐庶 QQ:1092002729
4 * @Slogan 致敬大师,致敬未来的你
5 */
6 @RestController
7 @RequestMapping("/user")
8 public class UserController {
9
10 @Autowired
11 UserService userService;
12
13 //Rest /user/1
14 @GetMapping("/{id}")
15 public Result getUser(@PathVariable Integer id) {
16 User user=userService.getUserById(id);
17 return new Result<>(200,"查询成功",user);
18 }
19
20 // 新增 /user/add
21 @PostMapping("/add")
22 public Result addUser(User user) {
23 userService.add(user);
24 return new Result<>(200,"添加成功");
25 }
26
27 // 修改 /user1
28 @PutMapping("/{id}")
29 public Result editUser(User user) {
30 userService.update(user);
31 return new Result<>(200,"修改成功");
32 }
33
34 // 修改 /user1
35 @DeleteMapping("/{id}")
36 public Result editUser(@PathVariable Integer id) {
37 userService.delete(id);
38 return new Result<>(200,"删除成功");
39 }
40
41 }
2.调用rest http接口
- 通过RestTemplate调用
- RestTemplate是Spring提供的用于访问Rest服务的,RestTemplate提供了多种便捷访问远程Http服务的方法,传统情况下在java代码里访问restful服 务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。 适用于微服务架构下 服务之间的远程调用 ps: 以后使用微服务架构, spring cloud feign
WebClient 都可以调用远程服务, 区别:webclient 依赖webflux , webclient 请求远程服务是无阻塞的,响应的。 RestTemplate 它是阻塞 的,需要等待请求响应后才能执行下一句代码
以前通过HttpClient
1 @RestController
2 public class OrderController {
3
4 // 声明了RestTemplate
5 private final RestTemplate restTemplate;
6
7 // 当bean 没有无参构造函数的时候,spring将自动拿到有参的构造函数,参数进行自动注入
8 public OrderController(RestTemplateBuilder restTemplateBuilder) {
9 this.restTemplate = restTemplateBuilder.build();
10 }
11
12 @RequestMapping("/order")
13 public String order(){
14 // 下单 需要远程访问rest服务
15
16 // 基于restTemplate 调用查询
17 /*Result forObject = restTemplate.getForObject("http://localhost:8080/user/{id}", Result.class, 1);
18 return forObject.toString();*/
19
20
21 // 基于restTemplate 调用新增
22 /*
23
24 User user = new User("徐庶", "随便");
25
26 // url: 请求的远程rest url
27 // object : post请求的参数
28 // Class<T>:返回的类型
29 // ...Object: 是@PathVariable 占位符的参数
30 ResponseEntity<Result> resultResponseEntity = restTemplate.postForEntity("http://localhost:8080/use
r/add", user, Result.class);
31 System.out.println(resultResponseEntity.toString());
32 return resultResponseEntity.getBody().toString();*/
33
34
35 // 基于restTemplate 调用修改
36 /* User user = new User(1,"徐庶", "随便");
37 //restTemplate.put("http://localhost:8080/user/add", user, Result.class);
38 HttpEntity<User> httpEntity = new HttpEntity<>(user);
39
40 ResponseEntity<Result> resultResponseEntity = restTemplate.exchange("http://localhost:8080/user/{i
d}", HttpMethod.PUT, httpEntity, Result.class, 1);
41 System.out.println(resultResponseEntity.toString());
42 return resultResponseEntity.getBody().toString();*/
43
44
45
46 // 基于restTemplate 调用删除
47 ResponseEntity<Result> resultResponseEntity = restTemplate.exchange("http://localhost:8080/user/{i
d}", HttpMethod.DELETE, null, Result.class, 1);
48 System.out.println(resultResponseEntity.toString());
49 return resultResponseEntity.getBody().toString();
50 }
51 }
也可以在单元测试下使用:
1 @SpringBootTest()
2 class ApplicationTests {
3
4 @Test
5 void contextLoads() {
6 TestRestTemplate restTemplate=new TestRestTemplate();
7 // 基于restTemplate 调用删除
8 ResponseEntity<Result> resultResponseEntity =
restTemplate.exchange("http://localhost:8080/user/{id}", HttpMethod.DELETE, null, Result.class, 1);
9 System.out.println(resultResponseEntity.toString());
10
11 }
12
13 }
3.通过postman调用
- 通过MockMvc测试
MockMvc是由spring-test包提供,实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,使得测试速度 快、不依赖网络环境。同时提供了一套验证的工具,结果的验证十分方便。
SpringBoot中使用
编写测试类。实例化MockMvc有两种形式,一种是使用StandaloneMockMvcBuilder,另外一种是使用 DefaultMockMvcBuilder。测试类及初始化MockMvc初始化:
1
2 @SpringBootTest
3 @AutoConfigureMockMvc
4 class MockMvcExampleTests {
5
6 @Test
7 void exampleTest(@Autowired MockMvc mvc) throws Exception {
8 mvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("Hello World"));
9 }
10
11 }
单元测试方法:
1 @Test
2 public void testHello() throws Exception {
3
4 /*
5 * 1、mockMvc.perform执行一个请求。
6 * 2、MockMvcRequestBuilders.get("XXX")构造一个请求。
7 * 3、ResultActions.param添加请求传值
8 * 4、ResultActions.accept(MediaType.TEXT_HTML_VALUE))设置返回类型
9 * 5、ResultActions.andExpect添加执行完成后的断言。
10 * 6、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情
11 * 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
12 * 7、ResultActions.andReturn表示执行完成后返回相应的结果。
13 */
14 mockMvc.perform(MockMvcRequestBuilders
15 .get("/hello")
16 // 设置返回值类型为utf‐8,否则默认为ISO‐8859‐1
17 .accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
18 .param("name", "Tom"))
19 .andExpect(MockMvcResultMatchers.status().isOk())
20 .andExpect(MockMvcResultMatchers.content().string("Hello Tom!"))
21 .andDo(MockMvcResultHandlers.print());
22 }
测试结果打印:
1 FlashMap:
2 Attributes = null
3
4 MockHttpServletResponse:
5 Status = 200
6 Error message = null
7 Headers = [Content‐Type:"application/json;charset=UTF‐8", Content‐Length:"10"]
8 Content type = application/json;charset=UTF‐8
9 Body = Hello Tom!
10 Forwarded URL = null
11 Redirected URL = null
12 Cookies = []
13 2019‐04‐02 21:34:27.954 INFO 6937 ‐‐‐ [ Thread‐2] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting
down ExecutorService 'applicationTaskExecutor'
4.通过swagger调用
相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档 会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。但是这个接口文档对于程序员来说, 就跟注释一样,经常会抱怨别人写的代码没有写注释,然而自己写起代码起来,最讨厌的,也是写注释。所以仅仅只通过强制来规范大家是不够的,随 着时间推移,版本迭代,接口文档往往很容易就跟不上代码了。
SpringBoot 整合swagger2.x
- 添加依赖
1 <dependency>
2 <groupId>io.springfox</groupId>
3 <artifactId>springfox‐swagger2</artifactId>
4 <version>2.9.2</version>
5 </dependency>
6 <dependency>
7 <groupId>io.springfox</groupId>
8 <artifactId>springfox‐swagger‐ui</artifactId>
9 <version>2.9.2</version>
10 </dependency>
- 添加swagger配置类
1
2 /***
3 * @Author 徐庶 QQ:1092002729
4 * @Slogan 致敬大师,致敬未来的你
5 */
6 @Configuration
7 @EnableSwagger2
8 public class SwaggerConfig {
9 @Bean
10 public Docket createRestApi() {
11 return new Docket(DocumentationType.SWAGGER_2)
12 .pathMapping("/")
13 .select()
14 .apis(RequestHandlerSelectors.basePackage("com.mine.controller"))
15 .paths(PathSelectors.any())
16 .build().apiInfo(new ApiInfoBuilder()
17 .title("SpringBoot整合Swagger")
18 .description("SpringBoot整合Swagger,详细信息......")
19 .version("1.0")
20 .contact(new Contact("徐庶","www.tulingxueyuan.cn","123@qq.com"))
21 .build());
22 }
23 }
访问:http://localhost:8080/swagger-ui.html
- 配置htpp接口
1 /***
2 * @Author 徐庶 QQ:1092002729
3 * @Slogan 致敬大师,致敬未来的你
4 */
5 @RestController
6 @Api(tags = "用户管理相关接口")
7 @RequestMapping("/user")
8 public class UserController {
9
10 @GetMapping("/{id}")
11 @ApiOperation("根据id查询用户的接口")
12 @ApiImplicitParam(name = "id", value = "用户id", defaultValue = "99", required = true)
13 public User getUserById(@PathVariable Integer id) {
14 User user = new User();
15 user.setId(id);
16 return user;
17 }
18 }
- 配置pojo类
1
2 /***
3 * @Author 徐庶 QQ:1092002729
4 * @Slogan 致敬大师,致敬未来的你
5 */
6 @ApiModel
7 public class User {
8 @ApiModelProperty(value = "用户id")
9 private Integer id;
10 @ApiModelProperty(value = "用户名")
11 private String username;
12 @ApiModelProperty(value = "用户地址")
13 private String address;
14
15 public Integer getId() {
16 return id;
17 }
18
19 public void setId(Integer id) {
20 this.id = id;
21 }
22
23 public String getUsername() {
24 return username;
25 }
26
27 public void setUsername(String username) {
28 this.username = username;
29 }
30
31 public String getAddress() {
32 return address;
33 }
34
35 public void setAddress(String address) {
36 this.address = address;
37 }
38 }
访问:http://localhost:8080/swagger-ui.html
扩展: 实现通过swagger记录请求日志
1
2
3 @Aspect
4 @Component
5 public class Testaop {
6
7 @Pointcut("execution( public * com.tulingxueyuan.controller.*(..))" +
8 "&&@annotation(io.swagger.annotations.ApiOperation)" )
9 public void log() {}
10
11 @Around("log()&&@annotation(apiOperation)")
12 public Object around(ProceedingJoinPoint pjp, ApiOperation apiOperation) {
13 Object result = null;
14 try {
15 //获取类对象
16 Class<?> controller = pjp.getThis().getClass();
17 //获取swagger接口对象
18 Api annotation = controller.getAnnotation(Api.class);
19 //获取类接口的内容
20 String description = annotation.description();
21 System.out.println("调用接口为:"+description +"‐"+ apiOperation.value());
22 //执行方法
23 result = pjp.proceed();
24 } catch (Throwable throwable) {
25 throwable.printStackTrace();
26 }
27
28 return result;
29 }
好了,今天就分享到这里了,文章后续及相关资料+代码,还有更多java学习资料,关注我,免费领取