java.net.ProtocolException:意外的状态行:{} HTTP / 1.1 422 Unprocessable Entity

时间:2016-07-06 21:29:06

标签: android http okhttp

我在我公司的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,但下一个请求总是失败。

我有什么选择?

1 个答案:

答案 0 :(得分:0)

您的网络服务器错误地使用HTTP 304响应返回响应数据。让他们解决这个问题。

在您等待的时候,您可以使用OkHttp network interceptor解决方法,为所有HTTP 304的响应标头添加Connection: close标头。