最近写了一个项目,在测试接口的时候遇到了点问题,折腾了蛮久的,所以记录一下
接口代码如下:
@RestController
public class MyController {
@Autowired
private MyService myService;
@GetMapping(value = "/view/{sharedId}")
public String view(@PathVariable String sharedId,
@RequestParam(required = false) String key) {
return myService.view(sharedId, key);
}
}
项目中还使用了全局异常处理器捕获错误返回统一json数据
public Result handleException(Exception e){
return Result.error(500, MessageConstant.UNKNOWN_ERROR);
}
测试使用的是knife4j-openapi3-jakarta-spring-boot-starter
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.5.0</version>
</dependency>
最后启动项目使用knife4j网页测试接口idea报错如下:
查阅资料得知原因:客户端请求中的Accept字段不正确或不匹配服务器的响应类型Content-Type导致的
由于第一次使用knife4j不太熟悉,在Java层尝试了很多方法都没解决,后来换了Apifox进行测试,结果没有问题。后来对比了knife4j和Apifox请求头发现了端倪
最终猜测原因是knife4j网页测试请求头Accept字段值根据Java代码自动识别生成,由于在Java代码中接口返回值为String,knife4j则生成了对应的字段值,而当接口在使用中报错被全局异常处理器捕获,并返回统一json数据,导致和knife4j生成的对应字段值不匹配。
解决办法:个性化配置 -> 开启动态请求参数,在请求头部添加 Accept 参数值 */* ,表示接收所有响应类型
解决以上问题后,在返回中文时又出现乱码问题
解决办法:@GetMapping注解设置produces属性指定字符集
@GetMapping(value = "/view/{sharedId}", produces = "text/html;charset=utf-8")
public String view(@PathVariable String sharedId,
@RequestParam(required = false) String key) {
return myService.view(sharedId, key);
}