J'ai appelé PATCH le service Web utilisant Retrofit2 mais onResponse n'est pas appelé et le onFailure est appelé - Malgré de le fonctionnement du service est réussi côté serveur parfaitement
Et chaque fois que j’essayais d’utiliser fiddler pour vérifier le bon fonctionnement du service, j’ai trouvé que le problème était que la sérialisation de la réponse du service à venir et lorsqu’on utilisait fiddler, j’ai constaté qu’aucun contenu de la réponse JSON n’était pris, le service de conversion a donc supposé que son échec était dû il n'y a pas de contenu et il ne peut pas sérialiser le contenu VIDE et me donner cette erreur
Java.io.EOFException: End of input at line 1 column 1
Réponse brute du violoniste
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 du violoniste est vide
service Web en 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 object 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);
retourne 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 modification 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);
Vous pouvez créer 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;
/**
* 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 créer. Pour 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!
Merci 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());