使用OkHttp3 / Retrofit将响应添加到响应中

时间:2017-05-25 13:53:50

标签: java android http retrofit okhttp

我正在尝试为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,如果这会影响任何事情。

3 个答案:

答案 0 :(得分:1)

我怀疑您在添加其他标头之前记录了响应。如果你对拦截器重新排序,你很可能会看到你期望它的响应标题,但你将失去请求标题。

查看this overview可能有助于您了解哪些拦截器可以查看哪些值。

答案 1 :(得分:0)

请求标头和响应标头不同。我不熟悉那个cookie商店,但是这个测试解释了如何在okHtttp中使用cookies。

https://github.com/square/okhttp/blob/c581f5ddc6a091e36e745a44ca787d903e32df51/okhttp-tests/src/test/java/okhttp3/CookiesTest.java#L78

答案 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());