我在我公司的Android应用程序上将HTTP库从Apache切换到OkHttp3。
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();
当连接设置为keep-alive(默认设置)时,某些请求会因以下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 Not Modified 响应,则这些请求始终会失败并出现此异常。
如果没有304响应,那些请求将被成功处理。
我到处都读到解决方案是将Connection Closed标头添加到请求中。
但是,我不想这样做。我们想要使用的连接池几乎没用。
保持连接存活是我们使用Apache的一个好处,我们希望与OkHttp保持相同的好处。
服务器似乎没有发送故障响应,因为通过向服务器发送没有失败的Postman请求来验证。此外,我们以前的Apache客户端正确处理了这些请求。
添加拦截器(网络或其他)似乎不起作用。我尝试填充正文或为304请求设置'Content-Length'为0,但下一个请求总是失败。
我有什么选择?
答案 0 :(得分:0)
您的网络服务器错误地使用HTTP 304响应返回响应数据。让他们解决这个问题。
在您等待的时候,您可以使用OkHttp network interceptor解决方法,为所有HTTP 304的响应标头添加Connection: close
标头。