web-dev-qa-db-ja.com

Retrofit2エラーJava.io.EOFException:行1列1の入力の終わり

[〜#〜] patch [〜#〜] Retrofit2を使用するWebサービスを呼び出しましたが、onResponseは呼び出されず、onFailureが呼び出されました- にもかかわらずサービスの操作はサーバー側で成功します完全に

そして、私はフィドラーを使用してサービスの動作を確認しようとするたびに、問題はサービスの今後の応答をシリアル化することであり、フィドラーを使用するとJSON応答のコンテンツがないことがわかったため、レトロフィットサービスは失敗したと仮定しましたコンテンツがなく、EMPTYコンテンツをシリアル化できず、このエラーを表示できません

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

フィドラの生の応答

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

フィドラーJson応答が空です

JavaのWebサービス

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

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

本体が空の場合、代わりに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);
72
Bhargav

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

それがあなたの問題に役立つことを願っています。ありがとう!

8
Thientvse

どうもありがとうございました。

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