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
}
}
To powoduje odrzucenie wyjątku IOException. Czemu? response.errorBody(). ToString() nie działa. Oczekuję, że zwróci surowy ciąg odpowiedzi. – DmitryBorodin
Tak, 'ciąg' może rzucić' wyjątek IOEx', ponieważ ciało jest strumieniowe. Gdy wywołasz 'string', odpowiedź jest odczytywana z sieci. – iagreen
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