Retrofit/Robospice: получить заголовки ответа от успешного запроса?

Я использую Retrofit/Robospice для выполнения вызовов API в приложении, которое я создал, с помощью RetrofitGsonSpiceService. Все ответы преобразуются в POJO с помощью преобразователя GSON, однако есть некоторая информация, которую мне нужно получить из заголовка ответа. Я не могу найти никаких средств для получения заголовков (я могу получить заголовки только в том случае, если запрос не удался, потому что необработанный ответ отправляется в объекте ошибки!). Как я могу перехватить ответ, чтобы получить заголовки до его преобразования?


person AndroidNoob    schedule 27.05.2014    source источник


Ответы (2)


Мне потребовалось несколько минут, чтобы понять, что именно @mato предлагал в своем ответе. Вот конкретный пример того, как заменить OkClient, поставляемый с Retrofit, для перехвата заголовков ответа.

public class InterceptingOkClient extends OkClient
{
    public InterceptingOkClient()
    {
    }

    public InterceptingOkClient(OkHttpClient client)
    {
        super(client);
    }

    @Override
    public Response execute(Request request) throws IOException
    {
        Response response = super.execute(request);

        for (Header header : response.getHeaders())
        {
            // do something with header
        }

        return response;
    }
}

Затем вы передаете экземпляр вашего пользовательского клиента в RestAdapter.Builder:

RestAdapter restAdapter = new RestAdapter.Builder()
    .setClient(new InterceptingOkClient())
    ....
    .build();
person moswald    schedule 13.08.2014

RoboSpice разработан таким образом, что он ничего не знает о HTTP-клиенте, который вы используете в своем приложении. При этом вы должны получить заголовки ответов от HTTP-клиента. Поскольку Retrofit может использовать Apache, OkHttp или клиент HTTP по умолчанию для Android, вам следует посмотреть, какой клиент, которым вы сейчас пользуетесь. Учтите, что Retrofit выбирает HTTP-клиент на основе определенных вещей (пожалуйста, обратитесь к документации по модификации или покопайтесь в коде, вы найдете его), если только вы не укажете его вручную.

Обновление определяет интерфейс для клиентов с именем Client. Если вы посмотрите на исходный код, то увидите, что этот интерфейс реализован в трех классах: ApacheClient, OkClient и UrlConnectionClient. В зависимости от того, какой из них вы хотите использовать, расширьте один из них и попытайтесь подключиться к коду, который выполняется, когда возвращается ответ, чтобы вы могли получить из него заголовки.

Как только вы это сделаете, вы должны установить для своего пользовательского Client значение Обновление.

person mato    schedule 29.05.2014
comment
Вам помог мой ответ? - person mato; 23.06.2014
comment
Привет @мато. Мне нужно сделать именно это. Ваш ответ помогает мне, но я не знаю, что делать, чтобы попытаться подключиться к части кода. Не могли бы вы привести пример, пожалуйста? Это может быть очень полезно. Спасибо. - person DEIONaLiMs; 30.07.2014
comment
@DEIONaLiMs Я хотел расширить один из этих трех классов и переопределить функциональность, в которой ответ возвращается с сервера, чтобы вы могли получать заголовки и делать все, что вам нужно. Этот новый класс, который вы создаете, можно затем установить в Retrofit в качестве HTTP-клиента. Попался? - person mato; 31.07.2014