web-dev-qa-db-fra.com

Retrofit2 error Java.io.EOFException: Fin de la saisie à la ligne 1, colonne 1

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);
33
Mina Farid

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);
72
Bhargav

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!

8
Thientvse

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());
4
Victor Fernando