【问题标题】:Retrofit "java.net.ProtocolException: Unexpected status line", Anyone?改造“java.net.ProtocolException:意外的状态行”,有人吗?
【发布时间】:2014-06-07 22:30:33
【问题描述】:

我的 Android 应用程序因以下堆栈跟踪而崩溃,但当我从桌面休息客户端尝试时,它运行良好。有谁知道可能是什么问题?

04-23 16:00:50.449  27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ ---> HTTP GET http://beta2.irealtor.api.iproperty.com.my/Listing?pageSize=10000&orderby=1&order=-1
04-23 16:00:50.449  27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ If-Modified-Since: 1398235278243
04-23 16:00:50.449  27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ User-Agent: Android/0.0.20
04-23 16:00:50.449  27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ Accept: application/json
04-23 16:00:50.449  27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ Authorization: WFdSeW8vOTJ1Z3BoQlBJMk53VGpaekZRY2pCd1pYSlVXUT090
04-23 16:00:50.449  27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ ---> END HTTP (0-byte body)
04-23 16:00:50.549  27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ ---- ERROR http://beta2.irealtor.api.iproperty.com.my/Listing?pageSize=10000&orderby=1&order=-1
04-23 16:00:50.549  27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ java.net.ProtocolException: Unexpected status line: {"Data":[],"CustomStatusCode":200,"Status":"success"}HTTP/1.1 200 OK
            at com.squareup.okhttp.internal.http.StatusLine.<init>(StatusLine.java:38)
            at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:150)
            at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:99)
            at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:595)
            at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:381)
            at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:328)
            at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:493)
            at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:71)
            at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:358)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:284)
            at $Proxy0.syncProperties(Native Method)
            at com.iproperty.android.apps.irealtor.sync.SyncHelper.performSync(SyncHelper.java:210)
            at com.iproperty.android.apps.irealtor.sync.SyncAdapter.onPerformSync(SyncAdapter.java:82)
            at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:259)
04-23 16:00:50.549  27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ ---- END ERROR


/**Sample code by using BasicHttpClient*/
BasicHttpClient httpClientTest = new BasicHttpClient();
httpClientTest.addHeader("If-Modified-Since", "1398312582192");
httpClientTest.addHeader("Authorization", "WFdSeW8vOTJ1Z3BoQlBJMk53VGpaekZRY2pCd1pYSlVXUT090");
httpClientTest.addHeader("User-Agent", "Android/0.0.20");
httpClientTest.addHeader("Accept", "application/json");

HttpResponse responseTest = httpClientTest.get("http://beta2.irealtor.api.iproperty.com.my/Listing?pageSize=100&orderby=1&order=-1",null);
final int statusTest = responseTest.getStatus(); // here i get 204, because i make server return 204 then there is nothing.
String body responseTest.getAsString() // here i get empty which is correct.

【问题讨论】:

  • 你有什么问题?
  • 嗨@GeraldSchneider,我已经编辑了这个问题。
  • 您的请求缺少身份验证。
  • 我已经通过了,看看 StackTrace 第 4 行。@AlexvandenHoogen
  • 将您的桌面客户端的网络请求与安卓应用的网络请求相匹配,并验证它们是否相同。

标签: java android retrofit okhttp


【解决方案1】:

我添加了一个网络拦截器,并为 okhttp3 客户端添加了关闭连接标头。

okHttpClient = new OkHttpClient.Builder()
                .addNetworkInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request request = chain.request().newBuilder().addHeader("Connection", "close").build();
                        return chain.proceed(request);
                    }
                })
                .build();

这样就解决了问题。 希望对您有所帮助!

【讨论】:

  • 使此更改有效,而仅将 @Headers("Connection:close") 添加到失败的 Retrofit 方法没有。
【解决方案2】:

在快速连续发送两个 POST 请求时也会收到此响应错误。解决方案是为这两个请求添加标头“Connection: close”。

【讨论】:

  • 如果你有多个请求,按照这里的说明添加拦截器更可靠:stackoverflow.com/a/36493143/369722。因为您可能无法控制请求的时间。
  • 谁能解释为什么会这样?我的专长更多是在客户端方面。
【解决方案3】:

您可以通过在改造方法上设置标题值 @Headers("Connection:close") 来解决此问题。
这对我有用。

【讨论】:

    【解决方案4】:

    前一个 HTTP 请求的响应正文长度出现问题,导致池连接损坏。

    前面的请求被 OkHttp 解释为没有正文,但它有这个正文:

    {"Data":[],"CustomStatusCode":200,"Status":"success"}
    

    这可能是服务器中的错误,也可能是 OkHttp 中的错误,具体取决于前面的 URL 发送的标头和代码。如果你能把这个失败之前的请求贴上去,我们就可以知道是谁的错了!

    【讨论】:

    • 会不会导致响应缓存?现在端点手册在 Data[] 长度为 0 时将 httpstatus 设置为 204。
    • 禁用响应缓存并尝试重现它!我的猜测是它是连接池。
    • 连接池?我使用 okHttpClient.setResponseCache(null) 禁用缓存; okHttpClient.setOkResponseCache(null);
    • 是...现在使用.net servicestack的api...你有什么想法吗?
    • 嗨@Jesse Wilson,我发现了问题,因为servicestack v3.9.70可能与标准不同或可能存在一些错误。因为时间关系。我们删除了 web.config 中的 servicestack 句柄。现在更改为 .Net WepApi2 时可以完美运行。非常感谢
    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2021-10-04
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多