traduccion solucion significa que krakentv kraken español end column android web-services retrofit2

android - solucion - Retrofit2 error java.io.EOFException: Fin de entrada en la línea 1 columna 1



eofexception retrofit (3)

Llamé al servicio web PATCH utilizando Retrofit2 pero onResponse no se llama y onFailure se llama A pesar de que la operación del servicio se realiza correctamente en el lado del servidor

Y cada vez que intentaba usar fiddler para comprobar que el servicio funcionaba, el problema se debía a que serializaba la próxima respuesta del servicio y, al utilizar fiddler, no había contenido de la respuesta de JSON, por lo que el servicio de actualización asumió que había fallado porque no hay contenido y no puede serializar el contenido VACÍO y darme este error

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

Respuesta cruda del violinista

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

Fiddler Json La respuesta está vacía

servicio 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 } }

Intenté reemplazar el objeto con String, JsonObject, emptyCalssBody ... pero falló

La interfaz del servicio web.

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


Muchas gracias.

Api

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

Clase

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


Puede crear 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); } }; } }

y añadir al código crear. Por ejemplo:

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

Espero que pueda ayudar a su problema. ¡Gracias!


simplemente devuelve void en su lugar, si el cuerpo está vacío

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

para la actualización con Rx java puedes usar algo como esto

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