Ошибка дооснащения2 java.io.EOFException: конец ввода в строке 1, столбец 1
Я назвал веб-службу PATCH, используя Retrofit2, но onResponse не вызывается, а onFailure называется Несмотря на работа службы выполняется со стороны сервера отлично
И всякий раз, когда я пытался использовать скрипач, чтобы проверить работоспособность службы, я обнаружил, что проблема заключается в том, что сериализация предстоящего ответа службы и при использовании скрипача я обнаружил, что никакого содержимого ответа JSON не было, поэтому служба Retrofit предположила, что его не удалось, поскольку нет содержимого и он не может сериализовать содержимое EMPTY
и дайте мне эту ошибку
java.io.EOFException: End of input at line 1 column 1
Отказоустойчивый ответ Fiddler
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 Response пуст
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
}
}
Я попытался заменить объект на String, JsonObject, emptyCalssBody.... но его неудачный
интерфейс веб-службы
@PATCH("alerts/{alert_id}/accept")
Call<Object> accept_invited_alerts(@Header("X-Api-Token") String
api_token, @Path("alert_id") int alert_id);
Ответы
Ответ 1
вместо этого просто верните void, если тело пустое
@PATCH("alerts/{alert_id}/accept") Call<Void> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);
для модернизации с помощью Rx Java вы можете использовать что-то вроде этого
@PATCH("alerts/{alert_id}/accept") Observable<Response<Void>> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);
Ответ 2
Вы можете создать 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);
}
};
}
}
и добавить в код создания. Например:
UploadImageNghiemThuApi uploadService = new Retrofit.Builder()
.baseUrl(Config.URL+"/")
.client(okHttpClient)
// -----add here-------
.addConverterFactory(new NullOnEmptyConverterFactory())
//---------------------
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(UploadImageNghiemThuApi.class);
Я надеюсь, что это может помочь вашей проблеме. Спасибо!
Ответ 3
Большое спасибо.
Api
@FormUrlEncoded
@POST("/rebu/insertusuario.php")
Call<Void> insertLogin(
@Field("email") String email,
@Field("senha") String senha,
@Field("codCondutor") Long codCondutor
);
Учебный класс:
Call call = service.insertLogin(login.getEmail(), login.getSenha(), login.getCodCondutor());