2015-10-15 12 views
5

ho semplice richiesta comeRetrofit 2 - ottenere l'errore-oggetto JSON (pochi POJO per stessa richiesta)

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

che restituisce sia LoginResponceobject se il codice HTTP 200

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

o errore di JSON, descrive errore esatto, se qualcosa è andato storto

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

Come posso gestire lo stato di errore in risposta?

Ho provato questo, ma non vede JSON in testo non elaborato (non funziona). E non sembra una buona soluzione.

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

risposta

3

Per ottenere l'accesso al corpo di risposta quando si dispone di un codice di errore, utilizzare errorBody() invece di body(). Inoltre, esiste un metodo string su ResponseBody da utilizzare al posto di 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

Questo genera IOException. Perché? response.errorBody(). ToString() non funziona. Mi aspetto che restituisca una stringa grezza di responce. – DmitryBorodin

+0

Sì, 'stringa' può lanciare una' IOException' perché il corpo è in streaming. Quando chiamate 'string', la risposta viene letta dalla rete. – iagreen

+0

Significa che il retrofit non legge il corpo in caso di codice non 200? Come posso leggere la risposta dalla rete nel corpo della chiamata di rete asincrona? A quanto mi risulta, la richiamata "onResponse" viene eseguita dopo che la connessione di rete è stata eseguita. Quindi, se il retrofit invierà nuove richieste, questo significa che non posso mettere "onResponse" nel thread dell'interfaccia utente, cosa che faccio ora. – DmitryBorodin

Problemi correlati