2015-10-15 77 views
5

我有一個像改造2 - 獲取錯誤對象JSON(用於相同的請求數POJO)

/*LOGIN*/ 
     @FormUrlEncoded 
     @POST("v1/user/login") //your login function in your api 
     Call<LoginResponce> login(@Field("identity") String identity, 
       @Field("password") String password); 

它返回LoginResponceobject如果任何HTTP代碼200

{"token":"itwbwKay7iUIOgT-GqnYeS_IXdjJi","user_id":17} 

或錯誤的Json簡單的要求,介紹確切的錯誤,如果出了什麼問題

{"status":4,"description":"user provided token expired"} 

如何處理錯誤狀態作爲迴應?

我試過這個,但是在原始文本中看不到JSON(doens't work)。而且似乎不是很好的解決方案。

mCallLoginResponse.enqueue(new Callback<LoginResponce>() { 
       @Override 
       public void onResponse(Response<LoginResponce> response, Retrofit retrofit) { 
        if (response.isSuccess()) { 

         registerWithToken(response.body().getToken()); 
        } else { //some error in responce 

         Gson gson = new GsonBuilder().create(); 
         ApiError mApiError = gson.fromJson(response.raw().body().toString(), 
ApiError.class); //Exception here - no JSON in String 
          //todo error handling 
         } 
        } 

回答

3

要訪問響應正文時,你有一個錯誤代碼,使用errorBody()代替body()。另外,您應該使用ResponseBody上的string方法,而不是toString

Gson gson = new GsonBuilder().create(); 
try { 
    ApiError mApiError = gson.fromJson(response.errorBody().string(),ApiError.class); 
} catch (IOException e) { 
    // handle failure to read error 
} 
+0

這引發IOException。爲什麼? response.errorBody()。toString()不起作用。我期望它返回原始響應字符串。 – DmitryBorodin

+0

是的,'string'可以拋出'IOException'因爲正文是流式傳輸。當你調用'string'時,響應從網絡中讀出。 – iagreen

+0

這是否意味着在非200代碼的情況下翻新不會讀取身體? 如何讀取asynchronius網絡調用正文中的網絡響應?至於我的理解,「網絡連接完成後執行」onResponse「回調。 所以,如果翻新會發送新的請求,這意味着我不能把「onResponse」放在UI線程中,我現在就這樣做。 – DmitryBorodin