gpt4 book ai didi

java - OkHttp 客户端不尊重 Accept header

转载 作者:行者123 更新时间:2023-12-02 03:10:27 26 4
gpt4 key购买 nike

使用相同的 url 和不同的接受 header 发出请求会从 okhttp 缓存返回先前的响应。

这意味着第一个请求是针对 application/json 数据发出的,第二个请求是针对 application/xml 数据发出的。因此,客户端从缓存返回 json 数据,而不是在上游执行 xml。

例如 GET 请求:http://example.com使用 header application/json 返回 Cache-Control header 和 json 负载。响应被缓存在内部 http 缓存中。第二个请求是在缓存控制窗口内向 http://example.com 发出的。带有标题 application/xml。在这种情况下,Okhttp 从缓存返回相同的 json 负载,而不是 xml 负载。

Builder builder = new Builder().url("https://httpbin.org/headers").header("accept", header);

有人遇到过这个问题吗?

最佳答案

描述缓存如何工作的相关 RFC 位于:https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6 :

If the selecting request header fields for the cached entry do not match the selecting request header fields of the new request, then the cache MUST NOT use a cached entry to satisfy the request unless it first relays the new request to the origin server in a conditional request and the server responds with 304 (Not Modified), including an entity tag or Content-Location that indicates the entity to be used.

OkHttp的Cache的源代码在这里:https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/Cache.java

缓存键就是资源的 URL。但缓存条目也会与“变化”请求 header 进行比较:

Response response = entry.response(snapshot);

if (!entry.matches(request, response)) {
Util.closeQuietly(response.body());
return null;
}

...

public boolean matches(Request request, Response response) {
return url.equals(request.url().toString())
&& requestMethod.equals(request.method())
&& HttpHeaders.varyMatches(response, varyHeaders, request);
}

当然,您可能发现了一个错误。我建议引入 OkHttp 源 JAR,在 Cache.get() 方法中使用断点进行调试,然后逐步查看是否/何时出错。如果确实如此,请向维护者提出或提交补丁。

关于java - OkHttp 客户端不尊重 Accept header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41124688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com