1

最新バージョンのレトロフィット、retrofit2、v2.0.0-beta3 を使用しています。API 応答は、User オブジェクトまたは空の応答 (null 値) です。正しいユーザー名/パスワードを送信すると、成功した User オブジェクトを使用して onResponse メソッドにハンドルが入ります。しかし、間違ったパスワードを送信すると、API は何も返さず、応答ヘッダーの値はほとんどありません。しかし、私はonFailure(Throwable) でMalformedJsonExceptionを取得しています。

「com.google.gson.stream.MalformedJsonException: JsonReader.setLenient(true) を使用して、行 1 列 1 パス $ で不正な形式の JSON を受け入れてください」

これがエラーのスクリーンショットです。 ここに画像の説明を入力

ResponseInceptor または Custom CallBack を使用して、null 応答を処理し、応答ヘッダーを読み取る方法が必要だと思います。しかし、これをどのように使用できるかわかりません。

ここにコードがあります、

// Define the interceptor, add authentication headers
Interceptor interceptor = new Interceptor() {
    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        Request newRequest = chain.request().newBuilder().addHeader("Authorization", new ITAuthorizationUtil().getAuthorization(user.getMobile_no(), user.getPassword())).build();
        return chain.proceed(newRequest);
    }
};

// Add the interceptor to OkHttpClient
OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(interceptor)
        .build();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(baseURL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();

ITAPIEndpointsInterface apiEndpointsInterface  = retrofit.create(ITAPIEndpointsInterface.class);


///
Call<User> call = apiEndpointsInterface.userLogin(senderId, applicationId, registrationId);

//asynchronous call
call.enqueue(new Callback<User>() {
    @Override
    public void onResponse(Response<User> response) {
            ApiResponse apiResponse = ITAPIStatusInfo.getApiErrorObject_Retrofit(response.headers());
            onSuccess( response.body(),apiResponse);
    }

    @Override
    public void onFailure(Throwable t) {
            Log.d(">>> ",t.getMessage());
    }

});
4

2 に答える 2

0

Gradle の依存関係に「com.squareup.retrofit2:converter-gson:2.0.0-beta3」を追加しましたか?

次のように Retrofit のインスタンスを作成するだけで済みます。

private static MyClient MyClient;
public static String baseUrl = "http://mybaseurl.com" ;

public static MyClient getClient() {
    if (MyClient == null) {

        OkHttpClient httpClient = new OkHttpClient();

        Retrofit client = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(httpClient)
                .addConverterFactory(GsonConverterFactory.create())
                //.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        MyClient = client.create(MyClient.class);
    }
    return MyClient;
}

また、ヘッダーの場合、追加するこの「Authorization」ヘッダーのように追加する別の方法は、ヘッダーが必要な API 呼び出しに対して @Header と呼ばれる注釈を API エンドポイント インターフェイスに追加するだけです。

例:

    @POST("/login/")
    Call<Farm> login(@Header("Authorization") String token, @Body User user);
于 2016-01-27T11:58:42.107 に答える