问题标签 [if-none-match]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1198 浏览

http - 何时发送“if-none-match”请求?

在优化我们网站的缓存行为时,我注意到大量的if-none-match请求被发送到我们的网站。据我了解缓存,只要缓存仍然有效,情况就不应该如此。

一个特定的请求会生成以下内容response-header

如您所见,缓存的有效期应为 300 天。按照我的理解,浏览器应该在那段时间直接使用它的缓存。只有在这段时间结束后,它才会发出带有 header 的请求if-none-match。但是浏览器似乎忽略了这一点,if-none-match并在每次加载页面时发送这个 -request 只是为了接收304-response ("Not Modified").

我需要更改什么以防止浏览器发送这些无用的请求?

0 投票
1 回答
1362 浏览

ajax - 如果服务器发送 Etag,是否需要在 ajax 请求中以编程方式设置 if-no-match

我的问题很简单。虽然在搜索时,我没有找到一个简单的令人满意的答案。

我正在使用 Jquery ajax 请求从服务器获取数据。服务器托管一个将 Etag 和 Cach-control 标头设置为GET requests. 服务器还设置 CORS 标头以允许Etag. Api 的客户端是一个浏览器网络应用程序。我正在使用 Ajax 请求来调用 Api。以下是简单 GET 请求后来自服务器的响应标头:

我只想知道:

我是否需要手动收集Etag从服务器发送的响应标头并将标头附加到 ajax 请求?或者浏览器在具有“Etag”if-no-match的请求中默认发送它conditional get

  • 我已经在浏览器中通过网络控制台进行了调试,似乎浏览器正在conditional GET自动执行并设置if-no-match标题。

  • 如果是正确的,假设我创建了一个新资源,然后我调用了 get 请求。它第一次给了我过去缓存的数据。但是当我重新加载页面时,它会提供更新的页面。所以我很困惑,如果服务器端的数据集发生了变化并且发送了不同Etag的数据,为什么浏览器不会从服务器获取更新的数据集,除非我必须重新加载

  • 在分页的情况下也是如此。假设我有一个 URL /users?next=0。每个新请求next is a query param的更改值。next因为每个响应都会得到自己的“Etag”。浏览器会根据请求存储“Etag”还是只存储Etag上一个获取请求的最新请求,而与 URL 无关。
0 投票
1 回答
411 浏览

rest - Etag 令牌如何在 HTTP 的条件 GET 中工作?

所以基本上我想了解请求中 If-None-Match 标头中 ETag 令牌值的工作。

我已经了解了If-modifies-since条件 GET 方法的工作原理。有人可以简单地解释条件 GET 在具有If-None-Match条件的 Etag 的情况下如何工作吗?

提前致谢 :)

0 投票
1 回答
83 浏览

firefox-os - 更新后的 FirefoxOS 市场(Fx0 设备)

我和至少其他一些用户在更新市场后无法使用市场。手机加载了应用程序,但页面就在那里。我跟踪了网络,发现服务器没有返回任何内容。如果我删除标题If-None-Match,我会得到响应。清除缓存、更改系统日期并不能解决问题。有人可以帮我解决这个问题吗?

0 投票
1 回答
1461 浏览

android - 如何在 android 上使用 OkHttp 的 ETag 和 If-None-Match

我使用我的应用程序中的 OkHttpClient (v3.0.1),但 ETag 和 If-None-Match 不起作用。</p>

例如:

首先 获取http://112.4.19.67/task/imags_avatar/20130607165126605.png

作为回应,我得到了 ETag 和 Last-Modified。

要求:</p>

回应:</p>

第二次 获取相同的网址:http: //112.4.19.67/task/imags_avatar/20130607165126605.png

我认为我可以看到请求中的 If-None-Match。但它不存在。

要求:</p>

回复:

我的代码

提前感谢您的帮助。

0 投票
3 回答
6037 浏览

ios - ETag 和 If-None-Match HTTP 标头不起作用

我的网络服务器中有一个文件,每次访问它时我都会将其下载到我的应用程序中,因为文件内容可能会被更改但如果它被更改,我只想下载那个时间,这样可以节省带宽,幸运的是这就是此ETagIf-None-Match 标头字段用于。

  • 当我第一次发出请求时,我从 HTTP 响应标头中检索ETag

第一次请求文件

  • 在随后的下载该文件的请求中,我会附加If-None-Match 标头字段的Etag值,这样如果没有更改,那么我会得到 HTTP 响应状态代码 304,否则如果有,我会得到 200文件中的更改。

    第二次请求同一文件

笔记:

当我在 chrome 中的Advanced REST Client Application中尝试上述步骤时,它可以正常工作,但是当我在 iOS 中尝试时,我总是得到响应代码 200,但它应该给我 304 用于后续请求。

这是我使用的示例代码

这是回复

响应:可选({ URL: http: //10.12.1.101/Etag/ringtone1.mp3 } {状态代码:200,标头{“接受范围”=字节;连接=“保持活动”;“内容长度” = 221552;“内容类型”=“音频/mpeg”;日期=“格林威治标准时间 2016 年 2 月 24 日星期三 14:57:53”;Etag =“\”36170-52c1cc36d9b40\“”;“保持活动”=“ timeout=5, max=100"; "Last-Modified" = "Fri, 19 Feb 2016 10:15:33 GMT"; Server = "Apache/2.4.16 (Unix) PHP/5.5.29"; } })

我在这里做错了什么?

0 投票
0 回答
1923 浏览

javascript - 获取 Etag 并在设置为 If-None-Match 标头的后续请求中使用它的最佳方法是什么?

我在这方面看到了很多其他问题,但由于 Node.js 是一种服务器端语言,“Etag 支持”似乎是指一个 nodejs 应用程序创建、发送和处理要返回给他们的客户端的代码。在我的情况下,当我将 Etag 值与If-None-Match标头匹配以发送回用于查看资源是否发生变化的其他请求。

此外,在这种情况下,正确的术语是什么。我是客户,我的移动应用程序用户是我的客户,所以他们是客户的客户吗?

我使用reqest,想知道是否有比设置局部etag变量更简单的方法,如果没有设置,则检查它是否已设置,然后使用一组没有空的标题'If-None-Match'和另一组带有它的标题,并在您在响应中抓取它时使用它像这样抓住

然后必须在函数中抓取并返回它returnEtag()并在第二组标题中使用它,依此类推。

这变得一团糟,更不用说我必须通过我的整个应用程序执行此操作,以便etag以更简单/更容易的方式管理每个不同请求的每个请求。是否有任何模块支持开箱即用地处理这个问题?

文档说明我应该执行以下操作

所有响应都返回一个 HTTP Cache-Control 标头。它的内容表示可以使用多长时间的缓存响应来减少不必要的 API 请求。访问此 API 的客户端必须注意此信息。

除此之外,每个响应都会返回一个 HTTP ETag 标头。它的内容将用于 HTTP If-None-Match 标头中对同一资源的后续请求。如果缓存的信息仍然有效,API 将返回状态代码 304 Not Modified。访问此 API 的客户端必须使用此技术,也称为条件 GET。

我使用我自己的服务器来访问此 API,然后将该数据保存到可以在移动应用程序上访问我的用户的火力库(将应用程序与其他公司 api 的密钥远离移动应用程序用户)。

0 投票
1 回答
7687 浏览

android - Android OkHttp如何处理ETag

我正在尝试使用 OkHttp 做 Android 离线缓存方法。流程是这样的:

  1. 我在标头字段中向服务器发送一个带有 ETag 空字符串的 HTTP 请求,if-none-catched服务器返回一个正确的 ETag。
  2. 然后我存储 ETag 并缓存响应。
  3. 下次当我触发相同的服务调用时,我会得到相同的 ETag 并将其设置为 HTTP 请求标头,如果 ETag 相同,服务器将返回 HTTP 304。

我现在的问题是如何存储和检索 ETag?OkHttp 默认会处理还是我需要在 SQLite 中存储?我一直在谷歌上寻找 OkHttp 实现 ETag 示例代码,但我得到的只是普通的缓存方法。我参考的链接:

  1. 我正在尝试使用 Java 的 HttpURLConnection 进行“条件获取”,但我从未得到 304 状态码
  2. https://github.com/square/okhttp/wiki/Interceptors
  3. 在Android中为OkHttp设置缓存的正确方法
  4. https://gist.github.com/polbins/1c7f9303d2b7d169a3b1#file-restcontroller-java-L45

到目前为止,我实现的只是第一次服务调用的缓存,但不再从服务器获取最新数据。欣赏是否有人可以提供一些指导或找到任何处理 ETag 和if-none-catch动态供 OkHttp 分享的好例子。任何澄清随时问。

0 投票
0 回答
755 浏览

java - OkHttp If-None-Match 标头丢失

我正在创建一个使用 OkHttp 网络库作为 HTTP 客户端的 Android 应用程序。我共享一个OkHttpClient缓存大小为 10 MB 的实例。流程是:我向服务器发送请求,服务器对其进行处理并生成ETag标头,OkHttp 应该将其If-None-Match连接到以下对同一 URL 的请求中的标头中。问题是If-None-Match请求的标头中缺少标头,因此Response.cacheResponse()总是返回null. 所以我的问题是:如何解决这个问题以使用响应缓存?

OkHttpClientSingleton.java:

发送请求代码片段:

可以在此处查看来自网络拦截器的两个相同请求的日志。

我在互联网上发现了很多类似的问题,但没有一个能帮助我解决这个问题。

任何帮助将非常感激。

0 投票
1 回答
182 浏览

etag - 带有接受语言的 ETag

我有一个 Web 服务,它为每个响应添加一个 ETag,以便将来的调用可以使用 HTTP 304(未修改)状态。我生成的 ETag 实际上只是查询类型的 Base64 编码以及时间戳。

我遇到的问题是浏览器是否请求具有不同接受语言的相同资源。浏览器当前发送相同的 If-None-Match 标头,因此响应是 304,即使实际资源会以不同的语言返回。所以我认为这样做的方法是添加一个 Vary Header,以向客户端指定响应随 Accept & Accept-Language 的不同而不同,如下所示。

变化:接受,接受-语言

但是,无论接受语言如何,我的浏览器 (Chrome) 都使用相同的 ETag。在这里使用的正确约定是什么?

谢谢