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
}
}
Questo genera IOException. Perché? response.errorBody(). ToString() non funziona. Mi aspetto che restituisca una stringa grezza di responce. – DmitryBorodin
Sì, 'stringa' può lanciare una' IOException' perché il corpo è in streaming. Quando chiamate 'string', la risposta viene letta dalla rete. – iagreen
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