问题标签 [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 回答
979 浏览

etag - 同时利用 etags 和分块编码?

更新的问题

我的应用程序如何利用 etags,引入流/分块编码是否会带来任何复杂性?


原始问题

使用 进行 HTTP 流式传输时Transfer-Encoding: chunkedContent-Length无法发送,因为它通常是未知的。

据我了解,当浏览器利用 etag 时,他们需要知道Content-Length. 如果提供了 etag 但未提供Content-Length,浏览器将永远不会发送If-None-Match.

有没有解决的办法?

0 投票
0 回答
225 浏览

nsurlconnection - NSUrlConnection 中 Etag 的处理似乎有点随机

设置

在我们当前的项目中,我们使用 AFNetworking(基于 Foundation URL Loading System)。到目前为止一切正常。

理论

最近我们在响应头中引入了ETag,默认应该是NSURLConnection(即Foundation URL Loading System)处理的。收到的 ETag 值(来自响应)应包含在下一个请求标头中作为“If-None-Match”。这就是理论。
实际上,我们的 ETag 是一个整数,我们的后端在每个有效请求上增加这个整数,并在响应头中发送这个增加的值。
在客户端中,我们什么也没做,并用 charles 检查了请求和响应标头。我们不打算集成一些缓存,我们只对 ETag 值处理感兴趣。

结果

结果真的很奇怪。对于第一个请求(大约 10 个请求),没有设置“If-None-Match”标头字段。在此期间之后,某些请求一切正常。最后收到的 ETag 值在下一个请求的“If-None-Match”标头字段中发送。然后在大约 30 个请求之后,“If-None-Match”标头字段中的值不是假定值。例如,最后收到的 ETag 值为 38,请求中的“If-None-Match”值为 8。

p>

问题

有没有人了解或了解如何在 NSURLConnection(即 Foundation URL 加载系统)中处理 ETag,以及为什么我们会看到这些奇怪的结果?
或者更直接,有没有人有一些技巧和练习如何解决这个问题?我们是否需要为 NSURLCache 或相关的东西设置一些特定的值?

0 投票
1 回答
319 浏览

http - Understand the weak comparison function

HTTP 1.1 defines a weak comparison function for cache validators:

in order to be considered equal, both validators MUST be identical in every way, but either or both of them MAY be tagged as "weak" without affecting the result.

I understand that following statement (for two ETags) is true:

Now I'm wondering what real world use case might exist where a server compares a weak ETag against a strong one.

0 投票
0 回答
335 浏览

httpresponse - 带有 if-none-match 的 codeception 获取请求不返回 304

我正在使用 codeception 来覆盖 REST API 的代码。在我目前的情况下,我想测试发送请求以接收所请求资源的 ETag-Header 的行为,并在标题为“If-None-Match”的同一资源上的第二次请求中重用此 ETag 的值实现304响应码。

所以我在 Cest-File 中所做的是:

当我执行此测试时,它在第二个请求说响应代码 200 与 304 不匹配后失败。当我使用外部工具(Firefox 的 HTTP 请求程序插件)执行相同的请求时,我得到了预期的行为。我必须做些什么才能让我的测试正常工作?我是否在代码接收方面发了一些错误信息,或者这可能是一个错误?

任何帮助表示赞赏,也许有人以前已经遇到过这种情况。在此先感谢您的帮助!

0 投票
1 回答
269 浏览

http - 如果无匹配:*

RFC2616 Sec 14 “14.26 If-None-Match”

“If-None-Match: *”的含义是,如果源服务器选择的表示存在,则不能执行该方法……如果表示不存在,则应该执行该方法。此功能旨在用于防止 PUT 操作之间的竞争。

我不明白这个功能如何防止竞争条件。这与简单地省略“If-Match”标头有什么不同吗?

0 投票
1 回答
448 浏览

facebook - 在 Facebook 上使用 ETag 但状态码始终为 200 而不是 304

当我尝试使用 ETag 调用https://graph.facebook.com/me/friends?fields=id,name,first_name,last_name,link,picture&access_token=MyAccessToken的请求时,我总是得到请求代码为 200每次。我做了两个背靠背的回应并检查了它。最后的变化是它有一个分页部分,并附加了一个访问令牌。这总是不同的,因此 ETag 值也会发生变化。我尝试在 Firefox 中使用 RESTClient Add-on,但行为相同。我还尝试了 Facebook Docs中提到的 Firebug 和 Modify Headers Add-ons,但没有任何变化。我试图打电话给另一个请求/我?它按预期工作,但对于 /me/friends 和 /me/events,它总是返回 200 响应。任何帮助表示赞赏。

这个问题类似于这个问题,但答案对我不起作用。谢谢你。

0 投票
2 回答
863 浏览

playframework - If-None-Match 标头是否会否决 Cache-Control: max-age?

我有一个提供图像的 webapp:

在此处输入图像描述

我清楚地Cache-Control正确设置了标题,并且网络服务器正在设置Etag.

问题是资源If-None-Match每次都被有效地忽略Cache-Control标题。(框架相应地返回 304,但存在往返)。

我读过Etag标题可能会否决Cache-Control,即使资源是本地且有效的,仍然会检查匹配项。这对我来说毫无意义。

有谁知道发生了什么?我在这里想念什么?

PD:Web 服务器是一个 Play!应用

0 投票
0 回答
96 浏览

django - 当我在 Django 的响应中设置 ETAG 时,为什么 request.META 不包含“HTTP-IF-NONE-MATCH”?

响应代码如下:

没有任何关于IF-NONE-MATCH下一个的信息request.META

有人可以告诉我为什么以及如何?

0 投票
1 回答
767 浏览

client - 从客户端代理的 Odata v4 Service T4 模板生成的代码不会将 If-None-Match 标头添加到查询请求

通过使用 ODataController 类并支持实体框架中的并发检查,我使用 OData v4 协议制作了 WebAPI 2 服务。客户端代码是使用 Odata Client T4 模板生成的。此代码生成从处理实体跟踪的 DataServiceContext 派生的代理类和容器类,解析 Odata URL 中的 LINQ 查询等。当跟踪的实体(包含检查并发性的属性)更新时,调用 SaveChangesAsync 方法的容器类生成 HTTP PATCH包含 If-Match 标头的请求,该标头具有从该实体的上次查询中收到的值,并且工作正常。

Fiddler 捕获的示例请求:

补丁/用户(2) HTTP/1.1

缓存

如果匹配:W/"J1Z1a2FzaWU3Bhc2IjJw=="

但是如果容器对实体进行查询,它会生成正确的 HTTP GET 请求

(来自请求的示例:

GET /Animals(8) HTTP/1.1)

但没有 If-None-Match 标头,即使在最后一个查询中,服务也会发送 etag 值作为响应

(来自响应的示例:

@odata.etag=W/"J0MxRjIn")

是否可以通过设置容器上下文配置请求管道属性或其他方式添加 If-None-Match 标头?只是补充说明 - 如果服务在 GET 请求的 If-None-Match 标头中获取 etag 值,它应该返回状态代码 304 NotModified 以防 etag 值匹配(表示实体未更改),否则服务在响应正文中发送实体属性.

更新:

我尝试通过处理 SendingRequest2 添加 If-None-Match,它使我能够手动添加 If-None-Match 标头,但在这种情况下,当服务接收请求并从中读取 etag 时,如果实体未更改(etag 匹配) ,答案将是状态码 304 - NotModified 和容器(派生 DataServiceContext 类的实例)将无法处理该响应,因为它需要正文消息中的实体,因此它会生成异常。我可以处理异常并使用它来确认实体没有被更改,但这不是优化的编程方式。我需要一种方法来处理请求和响应管道事件。在请求管道中,我将 etag 添加到单个查询请求中,在响应管道中,我将处理收到的状态代码 304 - NotModified。

context.Configuration.RequestPipeline 的列表是:

OnEntityReferenceLink(动作动作);

OnEntryEnding(动作动作);

OnEntryStarting(动作动作);

OnMessageWriterSettingsCreated(Action args);

OnNavigationLinkEnding(动作动作);

OnNavigationLinkStarting(动作动作);

并且 context.Configuration.ResponsePipeline 的列表是:

OnEntityMaterialized(动作动作);

OnEntryEnded(动作动作);

OnEntryStarted(动作动作);

OnFeedEnded(动作动作);

OnFeedStarted(动作动作);

OnMessageReaderSettingsCreated(操作 messageReaderSettingsAction);

OnNavigationLinkEnded(动作动作);

OnNavigationLinkStarted(动作动作);

0 投票
0 回答
1049 浏览

caching - ETag 是否会使 Cache-Control 标头无效?

我正在从我的 RESTful Web 服务中获取资源,并在响应中添加以下两个标头:

浏览器第一次收到此响应时,它会正确缓存 2 分钟。

但是,下次我请求资源时,我的浏览器现在发送了一个IfNoneMatch标头,并按304 Not Modified预期得到了一个标头,以及另一个Cache-Control要缓存 2 分钟的标头。

但是浏览器没有缓存响应。我不断刷新页面,它不断发出请求,因此不断得到304 Not Modified.

这是正常行为吗?

如何告诉浏览器在获得 2 分钟后重新验证其缓存资源304 Not Modified,并且不再发出任何请求?