SpringBoot资料合集-04【Spring Boot与Web开发】

12 篇文章 0 订阅
5 篇文章 0 订阅

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接口

  1. 通过RestTemplate调用
  2. 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调用

在这里插入图片描述

  1. 通过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 = [ContentType:"application/json;charset=UTF‐8", ContentLength:"10"] 
8 Content type = application/json;charset=UTF‐8 
9 Body = Hello Tom! 
10 Forwarded URL = null 
11 Redirected URL = null 
12 Cookies = [] 
13 20190402 21:34:27.954 INFO 6937 ‐‐‐ [ Thread2] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting 
down ExecutorService 'applicationTaskExecutor'

4.通过swagger调用

相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档 会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。但是这个接口文档对于程序员来说, 就跟注释一样,经常会抱怨别人写的代码没有写注释,然而自己写起代码起来,最讨厌的,也是写注释。所以仅仅只通过强制来规范大家是不够的,随 着时间推移,版本迭代,接口文档往往很容易就跟不上代码了。

SpringBoot 整合swagger2.x
在这里插入图片描述

  1. 添加依赖
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> 
  1. 添加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

  1. 配置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 } 
  1. 配置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学习资料,关注我,免费领取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值