2016-07-06 897 views
0

我将我们的HTTP库从Apache转换到我公司的Android应用程序中的OkHttp3。java.net.ProtocolException:意外的状态行:{} HTTP/1.1 422不可处理的实体

的okHttp客户端设置以下方式:

mDefaultClient = new OkHttpClient.Builder() 
       .readTimeout(getSocketTimeOut(), TimeUnit.MILLISECONDS) 
       .writeTimeout(getSocketTimeOut(), TimeUnit.MILLISECONDS) 
       .connectTimeout(getSocketTimeOut(), TimeUnit.MILLISECONDS) 
       .followRedirects(true) 
       .connectionPool(new ConnectionPool(MAX_TOTAL_CONNECTION, 5, TimeUnit.MINUTES)) 
       .addNetworkInterceptor(new StethoInterceptor()) 
       .followSslRedirects(true) 
       .build(); 

当连接设置为保持活动(默认设置),一些请求失败,出现以下Java异常:

java.net.ProtocolException: Unexpected status line: {}HTTP/1.1 422 Unprocessable Entity 

java.net.ProtocolException: Unexpected status line: {}HTTP/1.1 200 OK 

这些请求总是失败,出现此异常,如果该请求恰好在它返回304未修改响应与一个空的正文。

没有这304响应,这些请求被成功处理。

我已经阅读无处不在,解决方案是将连接关闭标头添加到请求。

但是,我不想这样做。我们想要使用的连接池几乎是无用的。

保持连接正常运行对我们来说是一种好处,我们希望保持与OkHttp相同的优势。

服务器似乎没有发送错误响应,通过发送邮递员请求到服务器进行验证,这不会失败。另外,我们以前的Apache客户端正确处理了这些请求。

添加拦截器(网络或其他)似乎不起作用。我尝试填充正文或为304请求设置'Content-Length'为0,但下一个请求总是失败。

我有什么选择?

+0

然后,前面的304响应格式不正确,或者您的库不正确地处理它。你有踪迹吗? –

回答

0

您的网络服务器不正确地返回HTTP 304响应的响应数据。让他们来解决这个问题。

在等待时,您可以使用OkHttp network interceptor解决方案,该解决方案将Connection: close标头添加到所有HTTP 304的响应标头中。

相关问题