OkHttp java.net.ProtocolException: Неочакван ред за състояние: nullHTTP/1.1 200 OK след отговор 204 БЕЗ СЪДЪРЖАНИЕ при използване на същата връзка

Трябва да извърша поредица от обаждания, използвайки една и съща връзка (okhttpclient отговаря на нуждите ми) и един от тях връща код на състоянието 204 (без тяло), но след „204 повикване“ с успех:

java.net.ProtocolException: Unexpected status line: nullHTTP/1.1 200 OK
at okhttp3.internal.http.StatusLine.parse(StatusLine.java:69)
at okhttp3.internal.http.Http1xStream.readResponse(Http1xStream.java:184)
at okhttp3.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:125)
at okhttp3.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:775)
at okhttp3.internal.http.HttpEngine.access$200(HttpEngine.java:86)
at okhttp3.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:760)
at okhttp3.internal.http.HttpEngine.readResponse(HttpEngine.java:613)
at okhttp3.RealCall.getResponse(RealCall.java:244)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
at okhttp3.RealCall.execute(RealCall.java:57)
at it.test.Main.main(Main.java:48)

При използване на заглавка на заявка „Връзка: затваряне“ (така че не се използва повторно връзка) проблемът не възниква.

Това е работещ основен сигнал за проблема. Той използва okHttp v3.3.0 и okio v1.8.0

public static void main(String[] args) {
try {
    String url200 = "http://www.cmsservice.provahosting.it/index.php?option=com_cmsmanager&key=ca25131a2f77fb2b80d82e63412fdc13&debug=1&cmd=status";
    String url204 = "http://www.cmsservice.provahosting.it/index.php?option=com_cmsmanager&key=ca25131a2f77fb2b80d82e63412fdc13&debug=1&cmd=getUpdates";

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS).build();

    //First request
    Request request = new Request.Builder()
            .url(url200)/*.addHeader("Connection", "close")*/
            .build();

    Response response = client.newCall(request).execute();
    System.out.println(response.code()+">>>>" + response.body().string().getBytes().length + "<<<<");
    response.body().close();

    //Second request
    Request request2 = new Request.Builder()
            .url(url204)/*.addHeader("Connection", "close")*/
            .build();
    response = client.newCall(request2).execute();
    System.out.println(response.code()+">>>>" + response.body().string().getBytes().length + "<<<<");
    response.body().close();

    //Third request
    Request request3 = new Request.Builder()
            .url(url200)/*.addHeader("Connection", "close")*/
            .build();
    response = client.newCall(request3).execute();
    System.out.println(response.code()+">>>>" + response.body().string().getBytes().length + "<<<<");
    response.body().close();

} catch (Exception e) {
    e.printStackTrace();
}

Може ли някой да ми помогне да разбера какво пропускам или дали е грешка?


person CarloS    schedule 25.05.2016    source източник


Отговори (1)


Изглежда, че вашият уеб сървър твърди, че предишният отговор няма тяло, но след това пише четиризнаково тяло „null“. Докладвайте проблема на поддържащите уеб сървъра и те трябва да го поправят.

person Jesse Wilson    schedule 26.05.2016
comment
Tnx за вашия отговор. но работещият код над тялото на отговора на заявката 204 е празен (0 байта), така че не разбирам откъде идва null... Okhttp клиентът дава ли тяло с дължина 0 по подразбиране за 204? Или наистина изглежда като поток? - person CarloS; 26.05.2016
comment
С помощта на анализатор на пакети (wireshark) мога да видя нулата ... така че сте прав :). Tnx отново - person CarloS; 26.05.2016