retrofit2 errorbody.content не доступен - PullRequest
0 голосов
/ 14 февраля 2019

Я новичок в мире Retrofit2, в настоящее время у меня проблема с получением errorbody от onNext.

Вот мой пример кода:

 public void onNext(Response<LoginResponse> value) {
      ResponseBody responseBody = value.errorBody();
      String sam = responseBody.toString();
 }

Моя проблема в том, что я не могуполучить errorbody (). content.Как будто это не доступно.

enter image description here

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Тела ошибки модернизации имеют тип OkHttp3 ResponseBody.Этот класс является абстрактным, и его реализации определяют различные способы внутреннего представления содержимого.

Существуют различные способы получения содержимого.Вы можете получить его в bytes в виде строки или даже получить InputStream для этого - проверьте их здесь .

Я полагаю, что простой способ - использовать string():

value.errorBody().string();

Обратите внимание, что эти методы обычно читают ответ из буфера, что означает, что, если я правильно помню, повторный вызов string() не даст вам содержимое ответа снова.В частности, string() также считывает все тело в память, что может вызвать исключение нехватки памяти.

Если у вас есть содержимое, если вы хотите, чтобы оно было объектом из вашей модели данных, выпридется десериализовать его вручную.Существует множество способов сделать это, и их легко найти в Интернете, но для полноты картины, вот способ сделать это с помощью gson:

String error = value.errorBody().string();
MyPojo pojo = new Gson().fromJson(error, MyPojo.class); 

(здесь MyPojoбудет вашим классом ошибок, представляющим ошибку)

0 голосов
/ 15 февраля 2019

Вы не можете получить errorBody без http-кода ошибки.Используйте smt так:

if (!value.isSuccessful && value.errorBody() != null) {
    val errorBodyText = value.errorBody()?.string()?:""
    val errorResponse = Gson().fromJson<ErrorObject>(errorBodyText, ErrorObject::class.java)
}
0 голосов
/ 14 февраля 2019

Вы можете попробовать:

String errorBody =  value.errorBody().string; 

или

String errorBody =  value.errorBody().toString(); 
...