简述

浏览器调用接口报错  net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)

错误描述:编码模块不完整,返回浏览器的流不完整

可能原因:

1、丢包

2、响应数据被限制

3、读取流异常终止


针对可能的原因排查可以从几个方面

1、网络是否稳定

2、服务器端是否有对响应数据做限制,比如:nginx转发的数据限制,spring/Servlet的HTTP响应数据大小限制,或者是自定义拦截器的响应数据限制

3、服务器的数据限制,如Tomcat


针对以上排查,根据查阅的资料,有如下具体方式以及对应的解决办法:

>> nginx转发的数据限制

修改nginx的配置文件,在对应的路径下(没有指明就location)里面增加
proxy_buffer_size 1024k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 16 1024k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 2048k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 2048k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传

然后重启nginx


>> tomcat数据限制

修改tomcat的server.xml文件,增加maxHttpHeaderSize属性
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxHttpHeaderSize="81920" 

然后重启 tomcat


>> spring 配置限制

根据spring boot 版本不同在application文件添加不同的配置

Spring Boot 1.3 或之前的版本,配置:
  multipart.maxFileSize = 100Mb
  multipart.maxRequestSize=150Mb

Spring Boot 1.4 版本后配置更改为:
  spring.http.multipart.maxFileSize = 100Mb 
  spring.http.multipart.maxRequestSize = 150Mb

Spring Boot 2.0 之后的版本配置修改为: 单位Mb改为MB了
  spring.servlet.multipart.max-file-size = 100MB 
  spring.servlet.multipart.max-request-size = 150MB


>> spring 加@ResponseBody 引起的流关闭

代码接口上去掉注解@ResponseBody


>> 拦截器

拦截过滤掉一些响应太大的响应


我的

原因:数据导出接口,需要导出量比较大的数据,然后异常,数据小的时候测试通过,数据量变大到一定程度,异常

接口如下:

@ResponseBody
public void exportImsirecord(@RequestBody(required = false) WarningBO warningBO, HttpServletResponse response){
    OutputStream os = response.getOutputStream();
    StringBuffer buf = new StringBuffer();
    buf.append(很多数据);
    os.write(buf.toString().getBytes("utf-8"));
}

请求后然后浏览器报错  net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)

同时后台也报错:流异常关闭

最后的解决办法是 去掉 @ResponseBody,接口变成

public void exportImsirecord(@RequestBody(required = false) WarningBO warningBO, HttpServletResponse response){
    
}

两个原因:

1、@ResponseBody 走了数据转换,有数据限制

2、过滤器 响应 ResponseBody 读取有时间限制,解析太久中断流


总结:

本质原因都是响应数据不完整导致,排查针对这个去就行,包括前端后端所有都有可能导致,常见的应该是数据配置限制了