Android Retrofit + Rxjava: Как получить ответ на код не200? - PullRequest
0 голосов
/ 27 апреля 2018

Вот так выглядит мой запрос:

ApiService apiService = retrofit.create(ApiService.class);
Observable<Response<UserUpdateResponse>> response = apiService.updateUser(Utils.getHeader(), object);

response.subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::onSuccessUpdate,
                    this::onErr,
                    this::hideDialogLoading);

Он должен вернуть 'code':'205' 'msg':'successfully update'. Но когда сервер ответит любым кодом 201,202 (что-нибудь не 200), это приведет к ошибке.

Вот ошибка.

java.net.ProtocolException: HTTP 205 имеет ненулевое значение Content-Length: 121

Так, как я могу предотвратить ошибку или как получить тело ошибки? Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Так что технически я могу получить ответ 2xx. Проблема заключалась в том, что тело ответа сервера в коде ответа 205, которое предполагается равным нулю (https://tools.ietf.org/html/rfc7231#section-6.3.6). Так что после установки нулевого тела на сервере, сторона андроида работает нормально.

0 голосов
/ 28 апреля 2018

Коды ответов HTTP имеют предопределенное определение, а некоторые имеют требования, которые они должны заполнять, чтобы считаться действительной полезной нагрузкой HTTP. Вы не можете переопределить, что эти коды значат для вашего приложения, и ожидать, что хорошо реализованные клиенты примут его.

В частности, HTTP 205 - Сбросить содержимое , к которому предъявляются следующие требования:

Поскольку код состояния 205 подразумевает, что дополнительный контент предоставляться не будет, сервер НЕ ДОЛЖЕН генерировать полезную нагрузку в ответе 205.

Как правило, приложения просто возвращают HTTP 200 для всех запросов и включают коды ошибок для конкретного приложения в полезную нагрузку. То, что вы делаете, не имеет особого смысла.

...