Я использую Retrofit/Robospice для выполнения вызовов API в приложении, которое я создал, с помощью RetrofitGsonSpiceService. Все ответы преобразуются в POJO с помощью преобразователя GSON, однако есть некоторая информация, которую мне нужно получить из заголовка ответа. Я не могу найти никаких средств для получения заголовков (я могу получить заголовки только в том случае, если запрос не удался, потому что необработанный ответ отправляется в объекте ошибки!). Как я могу перехватить ответ, чтобы получить заголовки до его преобразования?
Retrofit/Robospice: получить заголовки ответа от успешного запроса?
Ответы (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();
RoboSpice разработан таким образом, что он ничего не знает о HTTP-клиенте, который вы используете в своем приложении. При этом вы должны получить заголовки ответов от HTTP-клиента. Поскольку Retrofit может использовать Apache, OkHttp или клиент HTTP по умолчанию для Android, вам следует посмотреть, какой клиент, которым вы сейчас пользуетесь. Учтите, что Retrofit выбирает HTTP-клиент на основе определенных вещей (пожалуйста, обратитесь к документации по модификации или покопайтесь в коде, вы найдете его), если только вы не укажете его вручную.
Обновление определяет интерфейс для клиентов с именем Client
. Если вы посмотрите на исходный код, то увидите, что этот интерфейс реализован в трех классах: ApacheClient
, OkClient
и UrlConnectionClient
. В зависимости от того, какой из них вы хотите использовать, расширьте один из них и попытайтесь подключиться к коду, который выполняется, когда возвращается ответ, чтобы вы могли получить из него заголовки.
Как только вы это сделаете, вы должны установить для своего пользовательского Client
значение Обновление.