这个问题,我前段时间在项目中使用Retrofit遇到过,最后查到的解决办法有两种获取Response Headers的方法,第一种是直接在定义接口是让接口返回Retrofit的Response对象,在Response对象中可以获取到Headers,如:
@GET("/****act=****") Response<SomeClass> getSomeData();
在操作Response对象时,使用response.headers();得到Headers。
这样做需要修改所有的接口,不是一个很好的办法,我在查询官方文档得到了另外一个方法,就是在构建Retrofit的APIService,在OkHttpClient中加入Interceptor,用以拦截请求和响应获取请求头和响应头。此方法可用于Retrofit2和OKHttp3.
public static OkHttpClient genericClient() { OkHttpClient httpClient = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); //存入Session if (response.header("Set-Cookie") != null) { SessionManager.setSession(response.header("Set-Cookie")); } //刷新API调用时间 SessionManager.setLastApiCallTime(System.currentTimeMillis()); return response; } }) .build(); return httpClient; }
需要注意的一点是,Interceptor必须在OkHttpClient构建时加入,OKHttpClient的interceptors()方法返回的是一个不可编辑的列表,如果对其进行修改操作,会产生UnSupportedOperationException。
Retrofit retrofit = new Retrofit.Builder()... .build(); UserService userService = retrofit.create(UserService.class); Call<User> call = userService.loadUser(); Response<User> response = call.execute(); okhttp3.Response okResponse = response.raw(); Headers headers = okResponse.headers();
然后你就查okhttp的api好了
时间: 2024-10-14 19:23:53