异常
首先咱们上一下控制台打印异常:
16:06:58.970 [http-nio-9220-exec-1] INFO o.a.c.h.Http11Processor - [log,182] - Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: Request header is too large
背景
微服务接口中有一个业务,需要调用客户端接口转入了base64编码后的字符编码文件
原因:
初步一看是请求头里面携带的参数太大了导致的,默认咱们请求头允许携带的数据大小是。默认情况下,tomcat(8.0版本)允许的http请求header的最大值是8024个字节(8KB)
解决方案一(不推荐)
设置请求头大小后,重启服务即可
代码语言:javascript复制server:
max-http-header-size: 102400 #文件上转大小字节
为什么不推荐方案一 刚刚开始这样是能解决问题,但是后来自己仔细一想主要有2个方面的问题,
- 1,这样是控制了最大上转文件大小,那么如果文件大小超过了怎么办呢,必须要人工手动调整
- 2,这样处理还有一个致命性问题,也就是请求头里面携带大量参数也就是会导致一个句柄连接承载资源过重,严重影响服务的吞吐量,特别是并发大的情况下。故不推荐。
解决方案二
我们使用Feign调用时,默认会将参数header中也存放一份,所以就导致了header is too large,使用MultiValueMap解决这种问题了。
服务端:
代码语言:javascript复制/**
* 上传图片、视频,文件
*/
@PostMapping(value = "/test" )
public ResultDTO test(@RequestBody MultiValueMap<String,String> map ) throws IOException{
String base64 = map.getFirst("key");
System.out.println(base64);
MultipartFile multipartFile = BASE64DecodedMultipartFileUtil.base64ToMultipart(base64);
return ResultDTO.requestSuccess(ossService.upload(multipartFile,1));
}
客户端:
代码语言:javascript复制/***
* 上转文件
* @param map
* @return
*/
@PostMapping(value = "inner/file/test")
ResultDTO test(MultiValueMap<String,String> map );