Retrofit2-Fehler java.io.EOFException: Ende der Eingabe in Zeile 1, Spalte 1

Lesezeit: 4 Minuten

Benutzer-Avatar
Mina Farid

Ich rief PATCH Webdienst mit Retrofit2 aber onAntwort heißt nicht und die onAusfall wird genannt Trotz der Betrieb des Dienstes erfolgt serverseitig perfekt

Und immer wenn ich versuchte, Fiddler zu verwenden, um zu überprüfen, ob der Dienst funktioniert, stellte ich fest, dass das Problem darin bestand, dass die kommende Antwort des Dienstes serialisiert wurde, und bei der Verwendung von Fiddler stellte ich fest, dass kein Inhalt der JSON-Antwort vorhanden war, sodass der Retrofit-Dienst annahm, dass dies fehlgeschlagen ist, weil Es gibt keinen Inhalt und es kann den LEEREN Inhalt nicht serialisieren und mir diesen Fehler geben

java.io.EOFException: End of input at line 1 column 1

Fiddler rohe Antwort

HTTP/1.1 200 OK
Server: nginx/1.9.4
Date: Wed, 02 Mar 2016 09:55:55 GMT
Content-Type: application/json
Content-Length: 0
Connection: close
Status: 200 OK
X-Content-Type-Options: nosniff

Die Fiddler-Json-Antwort ist leer

Webservice in java

Call<Object> call = TimeCapp.services.accept_invited_alerts(HomeActivity.api_token, alert_id);

call.enqueue(new Callback<Object>()
{
    @Override
    public void onResponse (Call<Object> call, Response<Object> response)
    {
        if (response.isSuccess()) {
            String x = response.body();
        }
    }
    @Override
    public void onFailure (Call<Object>call, Throwable t)
    {
        String x = t.getMessage();//java.io.EOFException: End of input at line 1 column 1
    }
}

Ich habe versucht zu ersetzen Objekt mit String, JsonObject, emptyCalssBody …. aber es ist fehlgeschlagen

die Schnittstelle des Webservices

@PATCH("alerts/{alert_id}/accept")
Call<Object> accept_invited_alerts(@Header("X-Api-Token") String  
api_token, @Path("alert_id") int alert_id);

  • Geben Sie stattdessen einfach void zurück, wenn der Körper leer ist

    – Bhargav

    2. März 2016 um 10:48 Uhr


  • Ich habe den Objekttyp durch den Void-Typ im Java-Code ersetzt und in der Webservice-Rückgabe nicht geändert. Vielen Dank für Ihren Hinweis, damit Sie die Antwort posten können, um sie zu akzeptieren und zu markieren 🙂 @Bhargav

    – Mina Farid

    2. März 2016 um 11:00 Uhr

Benutzer-Avatar
Bhargav

Geben Sie stattdessen einfach void zurück, wenn der Körper leer ist

@PATCH("alerts/{alert_id}/accept") Call<Void> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);

Für die Nachrüstung mit Rx Java können Sie so etwas verwenden

@PATCH("alerts/{alert_id}/accept") Observable<Response<Void>> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);

BEARBEITEN: Für kotlin

@PATCH("alerts/{alert_id}/accept")
fun accept_invited_alerts(@Header("X-Api-Token")  api_token: String, @Path("alert_id") alert_id: Int): Call<Unit>

und

@PATCH("alerts/{alert_id}/accept")
fun accept_invited_alerts(@Header("X-Api-Token") api_token: String, @Path("alert_id") alert_id: Int): Observable<Response<Unit>>

  • bitte ändern Sie zu @PATCH(“alerts/{alert_id}/accept”) Callaccept_invited_alerts(@Header(“X-Api-Token”) String api_token, @Path(“alert_id”) int alert_id); @Bhargav

    – Mina Farid

    2. März 2016 um 11:13 Uhr

  • @MinaFared oops danke! Ich habe vergessen, dass es so funktioniert

    – Bhargav

    2. März 2016 um 11:14 Uhr


  • @Bhargav, Danke, du hast meinen Tag gerettet

    – Sadashiv

    21. Dezember 2016 um 13:51 Uhr

  • Wenn Sie RX verwenden, sollten Sie Response.class verwenden, die Nullkörper zulässt. Wie hier: Observable>

    – Devnock

    12. Juli 2018 um 1:21 Uhr


  • Ich habe gerade verwendet Completable als Antworttyp

    – Albert Vila Calvo

    30. April 2019 um 9:20 Uhr

Benutzer-Avatar
Thientvse

Sie können erstellen NullOnEmptyConverterFactory.class :

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;


public class NullOnEmptyConverterFactory extends Converter.Factory {

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        final Converter<ResponseBody, ?> delegate = retrofit.nextResponseBodyConverter(this, type, annotations);
        return new Converter<ResponseBody, Object>() {
            @Override
            public Object convert(ResponseBody body) throws IOException {
                if (body.contentLength() == 0) return null;
                return delegate.convert(body);               
            }
        };
    }
}

und zum Code erstellen hinzufügen. Zum Beispiel:

 UploadImageNghiemThuApi uploadService = new Retrofit.Builder()
            .baseUrl(Config.URL+"/")
            .client(okHttpClient)
            // -----add here-------
            .addConverterFactory(new NullOnEmptyConverterFactory())
            //---------------------
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(UploadImageNghiemThuApi.class);

Ich hoffe es kann deinem Problem helfen. Vielen Dank!

BEARBEITEN !!!

Für einen Kotlin-Anwendungsfall können Sie dies überprüfen

class NullOnEmptyConverterFactory : Converter.Factory() {
override fun responseBodyConverter(
    type: Type,
    annotations: Array<Annotation>,
    retrofit: Retrofit
): Converter<ResponseBody, *> {
    val delegate: Converter<ResponseBody, *> =
        retrofit.nextResponseBodyConverter<Any>(this, type, annotations)
    return Converter { body -> if (body.contentLength() == 0L) null else delegate.convert(body) }
}

}

  • Dies hat die Arbeit für mich erledigt, da ich immer noch einen potenziellen Fehlerantworttext lesen möchte, aber im Erfolgsfall gibt es keinen Inhalt, nur 200, Prost

    – verdammter Maurer

    14. Juni 2019 um 7:04 Uhr

  • Dies ist der wahre Weg, wie es gehandhabt werden sollte. Lob an den Autor! 🙂

    – rzaaeeff

    19. Juli 2019 um 13:52 Uhr

  • Vielen Dank! Das war wirklich hilfreich. Falls jemand nach dem Kotlin-Äquivalent sucht gist.github.com/rajivrnair/ddaef641d85b1dc402c72ac7e1cac0b6

    – Rajiv

    9. September 2020 um 12:25 Uhr


  • Hilft es zufällig beim Ende des Stream-Fehlers?

    – kwaruna

    17. Februar 2021 um 18:46 Uhr

Benutzer-Avatar
Viktor Fernando

Vielen Dank.

API

@FormUrlEncoded
@POST("/rebu/insertusuario.php")
Call<Void> insertLogin(
        @Field("email") String email,
        @Field("senha") String senha,
        @Field("codCondutor") Long codCondutor
);

Klasse:

Call call = service.insertLogin(login.getEmail(), login.getSenha(), login.getCodCondutor());

Benutzer-Avatar
Drachenfeuer

Für mich in Laravel habe ich keine Antwort gesendet, nachdem die Funktion abgeschlossen war, nur das Hinzufügen der folgenden Zeilen auf der Serverseite hat geholfen. Dies kann an die von Ihnen verwendete Sprache angepasst werden. Senden Sie einfach eine Antwort von der Serverseite.

use Response;

return Response::json(array(
            'result' => 'success',

        ));

1257960cookie-checkRetrofit2-Fehler java.io.EOFException: Ende der Eingabe in Zeile 1, Spalte 1

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy