我正在尝试为HTTP响应添加标头。这是我的拦截器无效:
builder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request addedTestRequest = request.newBuilder().addHeader("TEST", "test").build();
Response response = chain.proceed(addedTestRequest);
final Response addedTestResponse = response.newBuilder().addHeader("TEST", "test").build();
return addedTestResponse;
}
});
我可以在传出流量(请求)中看到标头TEST,但不在传入流量(响应)中。您知道问题是什么,还是有另一种方法可以将标题添加到响应中?
注意:我正在使用franmontiel/PersistentCookieJar和OkHttp3 / Retrofit,如果这会影响任何事情。
答案 0 :(得分:1)
我怀疑您在添加其他标头之前记录了响应。如果你对拦截器重新排序,你很可能会看到你期望它的响应标题,但你将失去请求标题。
查看this overview可能有助于您了解哪些拦截器可以查看哪些值。
答案 1 :(得分:0)
请求标头和响应标头不同。我不熟悉那个cookie商店,但是这个测试解释了如何在okHtttp中使用cookies。
答案 2 :(得分:0)
你可以简单地在你的OkHttp实例中添加两个拦截器,它们将进行下一步操作:
扫描回复中的Cookie;
将找到的Cookie保存到首选项中;
将来自首选项的Cookie附加到请求中;
当然,您可以根据自己的任务自定义此逻辑。
public class AddCookiesInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
HashSet<String> preferences = (HashSet) Preferences.getDefaultPreferences().getStringSet(Preferences.PREF_COOKIES, new HashSet<>());
for (String cookie : preferences) {
builder.addHeader("Cookie", cookie);
}
return chain.proceed(builder.build());
}
}
public class ReceivedCookiesInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
if (!originalResponse.headers("Set-Cookie").isEmpty()) {
HashSet<String> cookies = new HashSet<>();
for (String header : originalResponse.headers("Set-Cookie")) {
cookies.add(header);
}
Preferences.getDefaultPreferences().edit()
.putStringSet(Preferences.PREF_COOKIES, cookies)
.apply();
}
return originalResponse;
}
}
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.interceptors().add(new AddCookiesInterceptor());
okHttpClient.interceptors().add(new ReceivedCookiesInterceptor());