Retrofit2-Fehler java.io.EOFException: Ende der Eingabe in Zeile 1, Spalte 1
Lesezeit: 4 Minuten
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
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
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);
}
};
}
}
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! 🙂
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',
));
12579600cookie-checkRetrofit2-Fehler java.io.EOFException: Ende der Eingabe in Zeile 1, Spalte 1yes
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