簡體   English   中英

如何讓反應機構改造例外?

[英]How to get response body to retrofit exception?

我試圖通過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 我不知道為什么? 我是否需要使用rest適配器設置某些內容,以便將響應傳遞給改進的錯誤對象。

試試這段代碼:

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

使用Retrofit 2.0

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

如果字符串格式錯誤:

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

您的服務器應返回4xx HTTP錯誤代碼以使其正常工作。

當您的服務器返回HTTP 200時,這意味着成功的響應,它將使用onSuccess分支進行處理。 您傳遞給Callback<Object>可能已准備好處理成功和錯誤結果。

要確保這種情況,您可以通過添加下一個片段來檢查RetrofitError是否實際上是JsonParseException

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

你需要使用getErrorStream()。

如果HTTP響應指示發生錯誤,則getInputStream()將拋出IOException。 使用getErrorStream()來讀取錯誤響應。 可以使用getHeaderFields()以正常方式讀取標頭。

參考: github問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM