2015-10-15 14 views
5

Mam prosty wniosek jakModernizacja 2 - dostać błędów obiekt JSON (mało POJO dla samego wniosku)

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

która zwraca albo LoginResponceobject jeśli kod HTTP 200

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

lub błąd JSON, opisuje dokładny błąd, jeśli coś poszło nie tak

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

Jak mogę obsłużyć status błędu w odpowiedzi?

Próbowałem tego, ale nie widziałem JSON w surowym tekście (nie działa). I nie wydaje się być dobrym rozwiązaniem.

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

Odpowiedz

3

Aby uzyskać dostęp do treści odpowiedzi, kiedy masz kod błędu, należy errorBody() zamiast body(). Istnieje również metoda string na ResponseBody, którą powinieneś użyć zamiast 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

To powoduje odrzucenie wyjątku IOException. Czemu? response.errorBody(). ToString() nie działa. Oczekuję, że zwróci surowy ciąg odpowiedzi. – DmitryBorodin

+0

Tak, 'ciąg' może rzucić' wyjątek IOEx', ponieważ ciało jest strumieniowe. Gdy wywołasz 'string', odpowiedź jest odczytywana z sieci. – iagreen

+0

Czy to oznacza, że ​​modernizacja nie odczytuje treści w przypadku kodu innego niż 200? Jak mogę odczytać odpowiedź z sieci w treści połączenia sieciowego asynchronius? Po moim zrozumieniu wywołania zwrotnego "onResponse" wykonanego po nawiązaniu połączenia sieciowego. Tak więc, jeśli retrofit wyśle ​​nowe zapytania, oznacza to, że nie mogę umieścić "onResponse" w wątku UI, co teraz robię. – DmitryBorodin