Lingmoumou's Blog

きっといつかって愿うまま

0%

http://wiremock.org/

WireMock

WireMock 是基于 HTTP 的模拟器。它具备 HTTP 响应存根、请求验证、代理/拦截、记录和回放功能。
当开发人员的开发进度不一致时,可以依赖 WireMock 构建的接口,模拟不同请求与响应,从而避某一模块的开发进度。

阅读全文 »

https://swagger.io/

相信无论是前端还是后端开发,都或多或少地被接口文档折磨过,期望有一个好的接口文档。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。

  • 接口的文档在线自动生成。
  • 功能测试。

Swagger

阅读全文 »

同步处理与异步处理请求流程

在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理,也就是同步处理请求。如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成,而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。

阅读全文 »

文件上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Slf4j
@RestController
@RequestMapping("/file")
public class FileController {

@PostMapping
public FileInfo upload(MultipartFile file) throws IOException {
System.out.println(file.getName());
System.out.println(file.getOriginalFilename());
System.out.println(file.getSize());

File localFile=new File(folder,System.currentTimeMillis()+".txt");
file.transferTo(localFile);
return new FileInfo(localFile.getAbsolutePath());
}
}

一般情况下,上传的文件不会存放在本地,因此可以将file.transferTo()改成file.getInputStream(),获取文件流,然后写入其他地方中,如OSS中。

阅读全文 »

在日常的项目中,我们经常需要对请求进行拦截然后进行一些逻辑操作,拦截的方式有三种,分别是Filter、Interceptor和Aspect。

拦截顺序

Spring中的拦截机制,如果出现异常的话,异常的顺序是从里面到外面一步一步的进行处理,如果到了最外层都没有进行处理的话,就会由tomcat容器抛出异常。

阅读全文 »

有的时候,我们需要业务逻辑时抛出自定义异常,这个时候需要自定义业务异常类。

  • Exception:受检查的异常,这种异常是强制我们catch或throw的异常。你遇到这种异常必须进行catch或throw,如果不处理,编译器会报错。比如:IOException。
  • RuntimeException:运行时异常,这种异常我们不需要处理,完全由虚拟机接管。比如我们常见的NullPointerException,我们在写程序时不会进行catch或throw。
    RuntimeException也是继承自Exception的,只是虚拟机对这两种异常进行了区分。
阅读全文 »

Spring中使用@vaild 注解进行验证传过来的参数校验,然后通过统一异常处理。如@not null、@not blank、@not empty、@Email等等。但是实际业务中可能默认提供的注解不够用,因此需要自定义验证注解。

MyConstraintValidator.java

实现ConstraintValidator接口,它有两个泛型,如上图

  1. 自定义的注解类,
  2. 要验证的数据的类型(例如写了String类型的数据,那么这个注解就要放在String类型的字段上才会起作用,若写成Object,那么它可以接收任何数据类型的数据)。
  3. initialize是初始化方法;
  4. isValid为验证的逻辑方法,返回true,则验证通过,否则不通过。

在这个实现中,可以用@Autowire注入需要的类。

MyConstraint需要有message()、groups()、payload()三个属性。

阅读全文 »

Restful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。Restful适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

Restful 特点

  1. 每一个URI代表1种资源;
  2. 客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
  3. 通过操作资源的表现形式来操作资源;
  4. 资源的表现形式是XML或者HTML;
  5. 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。
阅读全文 »