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