Как вернуть и POJO, и необработанную строку ответа обратно с модернизацией? - PullRequest
0 голосов
/ 14 января 2020
FATAL EXCEPTION: main Process: com.packagename, PID: 11371 java.lang.IllegalStateException: Cannot read raw response body of a converted body.

При модернизации вы можете только когда-либо прочитать response.body () только один раз, так как это поток, и он автоматически закрывается, когда вы вызываете .string() или когда он автоматически преобразуется в любой класс модели, который у вас есть в Response<T> тип возврата. Если вы попытаетесь прочитать дважды, то получите ошибку выше.

Мне нужна как необработанная строка ответа, так и класс модели . Какой лучший способ сделать это? Я не хочу делать вызов API дважды. Есть ли способ дублировать тело ответа? В идеале я хотел бы просто вернуть String и T с ответом. Это значит, что вам не нужно отказываться от нововведений c, которые поставляются с модификацией

Ответы [ 2 ]

1 голос
/ 15 января 2020

Вы можете получить необработанное тело ответа, добавив перехватчик (https://square.github.io/okhttp/interceptors/) и скопировав responsebody BufferedSource перед возвратом ответа. У меня проблемы с пониманием, почему кто-то хотел бы сделать это, хотя.

Response response = chain.proceed(request);
ResponseBody responseBody = response.body();

ByteArrayOutputStream output = new ByteArrayOutputStream();
responseBody.source().getBuffer().copyTo(output);
String rawResponseBody = output.toString();

return response;
0 голосов
/ 14 января 2020

пример для класса модели:

public class Post {
    @SerializedName("text")
    private String text;
    private User   user;

    public String getText() {
        return text;
    }

    public User getUser() {
        return user;
    }
}

class User{
    @SerializedName("id")
    private int id;
    @SerializedName("name")
    private String name;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}}

для лучшего ответа: поместите класс модели и тело метода onResponse в свой вопрос

...