37

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ます。どうしてか分かりません?応答がレトロフィット エラー オブジェクトに渡されるように、残りのアダプタで何かを設定する必要がありますか。

4

4 に答える 4

5

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

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);
}
于 2015-12-07T13:47:42.320 に答える
3

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

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

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

public void failure(RetrofitError error) {
    Log.v(TAG, error.getMessage());
};
于 2014-04-15T08:18:33.447 に答える