我正在使用Retrofit / Robospice在我构建的app中使用RetrofitGsonSpiceService进行api调用。使用GSON转换器将所有响应转换为POJO,但是我需要从响应头中检索一些信息。我找不到任何获取标题的方法(如果请求不成功,我只能获取标题,因为原始响应是在错误对象中发送的!)如何在转换之前拦截响应以获取标题?
答案 0 :(得分:17)
我花了几分钟时间弄清楚@mato在答案中的确切含义。这是一个具体示例,说明如何替换Retrofit附带的OkClient
以拦截响应头。
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();
答案 1 :(得分:3)
RoboSpice 的设计方式与您最终在应用中使用的HTTP客户端无关。话虽这么说,你应该从HTTP客户端获取响应头。由于 Retrofit 可以使用 Apache , OkHttp 或默认Android HTTP 客户端,您应该看看哪个您当前正在使用的客户。考虑到 Retrofit 根据某些事情选择HTTP客户端(请参阅Retrofit文档,或深入研究代码,你会发现它),除非你手动指定它。
Retrofit 为名为Client
的客户端定义了一个接口。如果您查看源代码,您将看到三个类实现此接口:ApacheClient
,OkClient
和UrlConnectionClient
。根据您要使用的其中一个,从其中一个扩展,并尝试挂钩响应返回时执行的代码,以便您可以从中获取标题。
完成此操作后,您必须将自定义Client
设置为 Retrofit 。