Rétrofit2 erreur java.io.EOFException: fin de la saisie à la ligne 1 colonne 1
j'ai appelé PATCH service web utilisant Retrofit2 mais onResponse n'est pas appelé et l' onFailure s'appelle Malgré le fonctionnement du service est réussi sur le côté serveur parfaitement
et chaque fois,j'ai essayé d'utiliser fiddler pour vérifier le fonctionnement du service, j'ai trouvé le problème est que sérialiser la réponse à venir du service et en utilisant fiddler j'ai trouvé qu'aucun contenu du JSON réponse ainsi, le service de mise à niveau a supposé que son échec parce qu'il n'y a pas de contenu et il ne peut pas sérialiser le contenu vide et donne-moi de cette erreur
java.io.EOFException: End of input at line 1 column 1
Fiddler raw Response
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
la réponse JSON de Fiddler est vide
webservice 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
}
}
j'ai essayé de remplacer objet Avec String, JsonObject, emptyCalssBody .... mais son échec
l'interface du webservice
@PATCH("alerts/{alert_id}/accept")
Call<Object> accept_invited_alerts(@Header("X-Api-Token") String
api_token, @Path("alert_id") int alert_id);
3 réponses
retournez simplement le vide à la place, si le corps est vide
@PATCH("alerts/{alert_id}/accept") Call<Void> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);
pour la mise à niveau avec RX java vous pouvez utiliser quelque chose comme ceci
@PATCH("alerts/{alert_id}/accept") Observable<Response<Void>> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);
je vous Remercie beaucoup.
Api
@FormUrlEncoded
@POST("/rebu/insertusuario.php")
Call<Void> insertLogin(@Field("email") String email,
@Field("senha") String senha,
@Field("codCondutor") Long codCondutor);
Classe
Call call = service.insertLogin(login.getEmail(), login.getSenha(), login.getCodCondutor());
Vous pouvez créer NullOnEmptyConverterFactory.classe:
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;
/**
* Created by thientvse on 18/05/2018.
*/
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);
}
};
}
}
et ajouter au code create. Ex:
UploadImageNghiemThuApi uploadService = new Retrofit.Builder()
.baseUrl(Config.URL+"/")
.client(okHttpClient)
// -----add here-------
.addConverterFactory(new NullOnEmptyConverterFactory())
//---------------------
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(UploadImageNghiemThuApi.class);
j'espère que cela peut aider votre problème. Merci!