Модернизация java.net.ProtocolException: непредвиденная строка состояния, кто-нибудь?

В моем приложении для 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.

person Shawn Thye    schedule 23.04.2014    source источник
comment
каков твой вопрос?   -  person Gerald Schneider    schedule 23.04.2014
comment
Привет @GeraldSchneider, я отредактировал вопрос.   -  person Shawn Thye    schedule 23.04.2014
comment
В вашем запросе отсутствует аутентификация.   -  person Alex van den Hoogen    schedule 23.04.2014
comment
я прошел, посмотрите строку 4 StackTrace. @AlexvandenHoogen   -  person Shawn Thye    schedule 23.04.2014
comment
Сопоставьте веб-запрос вашего настольного клиента с веб-запросом приложения для Android и проверьте, совпадают ли они.   -  person Coder    schedule 23.04.2014
comment
Да, я сделал это с настольным клиентом   -  person Shawn Thye    schedule 23.04.2014


Ответы (4)


Что-то вызывает проблемы с длиной тела ответа предыдущего HTTP-запроса, что приводит к повреждению объединенного соединения.

Предыдущий запрос был интерпретирован OkHttp как не имеющий тела, но у него есть это тело:

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

Вероятно, это либо ошибка на сервере, либо ошибка в OkHttp, в зависимости от того, какие заголовки и код были отправлены предыдущим URL-адресом. Если вы сможете вставить запрос, предшествующий этому сбою, мы сможем выяснить, чья это вина!

person Jesse Wilson    schedule 23.04.2014
comment
Можно ли будет вызвать кеш ответов? теперь в руководстве по конечной точке для httpstatus установлено значение 204, когда длина Data[] равна 0. - person Shawn Thye; 24.04.2014
comment
Отключите кеш ответов и попытайтесь воспроизвести его! Я предполагаю, что это пул соединений. - person Jesse Wilson; 24.04.2014
comment
Пул соединений? я отключаю кеш с помощью okHttpClient.setResponseCache(null); okHttpClient.setOkResponseCache (нулевой); - person Shawn Thye; 24.04.2014
comment
Да... прямо сейчас API использует стек служб .net... есть ли у вас какие-либо идеи об этом? - person Shawn Thye; 25.04.2014
comment
Привет, @Jesse Wilson, я обнаружил проблему в том, что сервисный стек версии 3.9.70 может отличаться от стандарта или, возможно, какая-то ошибка. Потому что время беспокоит. Мы удаляем дескриптор стека сервисов в web.config. теперь отлично работает при изменении на .Net WepApi2. Большое спасибо - person Shawn Thye; 25.04.2014
comment
Просто делюсь этим, чтобы помочь, если кто-то совершит ту же ошибку, что и я. У меня был этот ответ PHP на сервере. заголовок (HTTP/1.0 304 не изменен); эхо без изменений; выход(); Как объяснил Джесси, эхо после 304 испортило следующий HTTP-запрос. - person Dumi Jay; 29.05.2020

я добавляю сетевой перехватчик и добавляю к нему заголовок закрытия соединения для клиента 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();

И это решает проблему. Надеюсь, поможет!

person Pablo Johnson    schedule 08.04.2016
comment
Внесение этого изменения сработало, тогда как добавление @Headers("Connection:close") только к неудачному методу модернизации не помогло. - person Julian A.; 24.09.2019

Также возникает эта ошибка ответа при быстрой отправке двух запросов POST. Решение состоит в том, чтобы добавить заголовок «Соединение: закрыть» для обоих этих запросов.

person freebiefalk    schedule 19.06.2014
comment
Если у вас есть несколько запросов, надежнее добавить перехватчик, как указано здесь: stackoverflow.com/a/36493143/369722 . Потому что вы можете быть не в состоянии контролировать время запросов. - person Julian A.; 24.09.2019
comment
Кто-нибудь может объяснить, почему это работает? Мой опыт больше связан с клиентской стороной вещей. - person ekreloff; 02.10.2019

Вы можете исправить это, установив значение заголовка @Headers("Connection:close") в вашем методе модификации.
Это сработало для меня.

person vinay    schedule 21.04.2016