web-dev-qa-db-ja.com

後付けの例外に応答本文を取得する方法は?

Androidアプリケーションでレトロフィットを介して残りのサービスに接続しようとしています。しかし、応答があります。しかし、サービスからエラー応答があると、変換例外が発生します。応答本文に基づいていますが、NULLとして応答本文を取得していますが、レトロフィットログにはエラーメッセージがあります。

D/Reftofit log(24856): OkHttp-Received-Millis: 1397527055676
D/Reftofit log(24856): OkHttp-Response-Source: NETWORK 200
D/Reftofit log(24856): OkHttp-Sent-Millis: 1397527055492
D/Reftofit log(24856): Server: Apache/2.2.22 (Ubuntu)
D/Reftofit log(24856): X-Powered-By: PHP/5.3.10-1ubuntu3.10
D/Reftofit log(24856): {"result":"Invalid Token ID"}

コード:

public void failure(RetrofitError retrofitError) {
    String response = null;
    TokenError tokenError = (TokenError) retrofitError.getBodyAs(TokenError.class);
    response = tokenError.getErrorDetails();
    Log.e(TAG, response);
    if (response != null && response.contains("Invalid Token ID")) {
        GroupDataProvider.getInstance().onFailure();
    }

}

ここでは、tokenErrorとしてnullを取得しています。理由がわかりませんか?応答がレトロフィットエラーオブジェクトに渡されるように、レストアダプターで何かを設定する必要がありますか。

36

このコードを試してください:

@Override
public void failure(RetrofitError error) {
    String json =  new String(((TypedByteArray)error.getResponse().getBody()).getBytes());
    Log.v("failure", json.toString());
}

Retrofit 2.

@Override
public void onFailure(Call<Example> call, Throwable t) {
    String message = t.getMessage();
    Log.d("failure", message);
}
73
Cabezas

エラーが文字列形式の場合:

public Sring getErrorBodyAsString(RetrofitError error) {    
      return (String) error.getBodyAs(String.class)
}

カスタムオブジェクトが必要な場合:

class ErrorResponse {
   @SerializedName("error")
   int errorCode;

   @SerializedName("msg")
   String msg;
}

public T getErrorBody(RetrofitError error, Class<T> clazz) {    
      return (T) error.getBodyAs(clazz);
}
5

これを機能させるには、サーバーが4xx HTTPエラーコードを返す必要があります。

サーバーがHTTP 200を返すとき、これは成功した応答を意味し、onSuccessブランチで処理されます。 Callback<Object>に渡すオブジェクトは、成功とエラーの両方の結果を処理する準備ができているはずです。

これを確実にするために、次のスニペットを追加して、RetrofitErrorが実際にJsonParseExceptionであるかどうかを確認できます。

public void failure(RetrofitError error) {
    Log.v(TAG, error.getMessage());
};
3

これにはgetErrorStream()を使用する必要があります。

HTTP応答がエラーの発生を示している場合、getInputStream()はIOExceptionをスローします。 getErrorStream()を使用してエラー応答を読み取ります。ヘッダーは、getHeaderFields()を使用して通常の方法で読み取ることができます。

参照: github issue

0
LOG_TAG