当前位置: 首页 > 知识库问答 >
问题:

使用ETAG时Okhttp不返回缓存响应

鄢翰藻
2023-03-14

我有一个简单的用例,服务器为请求返回Etag,并将该Etag作为标头(即if-none-match)添加到所有后续url请求。如果响应中有变化,服务器可以用200响应,否则可以用304响应。对于后者,重用缓存中的响应是有意义的。但是okhttp总是返回null作为缓存响应。

我做了一些故障排除,okhttp在内部将响应写入磁盘,但是CachingStrategy不会将其返回到CacheInterceptor。仔细研究CachingStrategy类,有一些文档明确说明不会使用缓存:

 /**
     * Returns true if the request contains conditions that save the server from sending a response
     * that the client has locally. When a request is enqueued with its own conditions, the built-in
     * response cache won't be used.
     */
    private fun hasConditions(request: Request): Boolean =
        request.header("If-Modified-Since") != null || request.header("If-None-Match") != null
  }

编辑-更正,Okhttp正确地添加了etag标头。我需要使用网络拦截器与常规拦截器来查看etag标头被添加到后续请求中

与这些问题有些关联:

  • https://github.com/square/okhttp/issues/1400
  • https://github.com/square/okhttp/issues/831#issuecomment-57900979

共有1个答案

淳于功
2023-03-14

要么自己进行缓存,要么让OKHTTP的缓存进行缓存。当您添加自己的条件时,OkHttp假定您希望完全控制缓存,并且它不参与其中。

 类似资料:
  • 我在使用AFNetworking和ETag值实现缓存时遇到问题。我的服务器为每个请求返回Cache-Control和ETag头值。但如果我再次请求相同的资源,AFNetworking将不会添加ETag。我应该手动保存每个响应的etag并将其附加到下一个请求吗? 在应用程序委托中,我已经设置了缓存对象: 另外,我使用的是AFHTTPRequestSerializer的默认缓存策略。 有什么想法吗?问

  • 我读到了关于和的相互矛盾的语句。 这个答案说: 使用must-revalidate时,如果服务器不响应重新验证请求,浏览器/代理应该返回504错误。在没有缓存的情况下,它只显示缓存的内容 然而,“只显示缓存的内容”而不进行重新验证与https://datatracker.ietf.org/doc/html/RFC7234#section-5.2.1.4中的内容相矛盾: “no-cache”requ

  • 在React Native应用程序中实现以下场景的最佳方式是什么? 向服务器发出HTTP请求,获取JSON响应和ETag头 保存此JSON响应的方式即使在用户重新启动应用程序后也会持续 每当重复此HTTP请求时,发送If-None-Match头。 当您得到“未修改”响应时,请使用持久化缓存中的版本 当您得到“成功”响应(表示响应已更改)时,使持久化缓存无效,保存新响应 React Native有现

  • 我在java Play Framework作业中使用Caffeine cache实现来缓存传出的http请求,我看到,尽管缓存已经启动并运行,但我的服务仍然每次都访问外部服务器,而不是返回缓存中的值。我看到记录在日志中的键总是相同的。 所以我看到没有设置,所以这可能意味着缓存立即过期。但我仍然不知道如何在配置中设置它 我没有更改我的java代码,如果我需要这样做,我找不到任何示例,或者我只应该有一

  • 我正在尝试使用ETags和nginx (1.2.1)服务器理解本地缓存,该服务器将php的请求重定向到php-cgi守护进程。 这里是我的简单索引。电话: 在第二个请求之后,我的浏览器会发送一个 If-None-匹配 标头: 但是我的网络服务器没有返回304: 除非我误解了,否则我的服务器应该将 Etag 与发送的 If-None-Match 进行比较,并返回 304 响应,因为它们是相同的。 我

  • 我希望有人能对我一直在研究但没有取得多大进展的一些事情有所帮助。 我想利用 NSURLCache 来返回我在 iOS 应用程序中进行的 API 调用的缓存响应。当设备联机时,如果缓存的响应足够新,我想返回它,否则从远程获取。当设备脱机时,我希望立即返回缓存的响应(如果有),无论其年龄如何。 我正在使用AFNetworking。我正在对我控制的服务器进行API调用。协议是HTTPS。响应头当前为。我