问题标签 [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.
etag - 同时利用 etags 和分块编码?
更新的问题
我的应用程序如何利用 etags,引入流/分块编码是否会带来任何复杂性?
原始问题
使用 进行 HTTP 流式传输时Transfer-Encoding: chunked
,Content-Length
无法发送,因为它通常是未知的。
据我了解,当浏览器利用 etag 时,他们需要知道Content-Length
. 如果提供了 etag 但未提供Content-Length
,浏览器将永远不会发送If-None-Match
.
有没有解决的办法?
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 或相关的东西设置一些特定的值?
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.
httpresponse - 带有 if-none-match 的 codeception 获取请求不返回 304
我正在使用 codeception 来覆盖 REST API 的代码。在我目前的情况下,我想测试发送请求以接收所请求资源的 ETag-Header 的行为,并在标题为“If-None-Match”的同一资源上的第二次请求中重用此 ETag 的值实现304响应码。
所以我在 Cest-File 中所做的是:
当我执行此测试时,它在第二个请求说响应代码 200 与 304 不匹配后失败。当我使用外部工具(Firefox 的 HTTP 请求程序插件)执行相同的请求时,我得到了预期的行为。我必须做些什么才能让我的测试正常工作?我是否在代码接收方面发了一些错误信息,或者这可能是一个错误?
任何帮助表示赞赏,也许有人以前已经遇到过这种情况。在此先感谢您的帮助!
http - 如果无匹配:*
RFC2616 Sec 14 “14.26 If-None-Match”
“If-None-Match: *”的含义是,如果源服务器选择的表示存在,则不能执行该方法……如果表示不存在,则应该执行该方法。此功能旨在用于防止 PUT 操作之间的竞争。
我不明白这个功能如何防止竞争条件。这与简单地省略“If-Match”标头有什么不同吗?
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 响应。任何帮助表示赞赏。
这个问题类似于这个问题,但答案对我不起作用。谢谢你。
playframework - If-None-Match 标头是否会否决 Cache-Control: max-age?
我有一个提供图像的 webapp:
我清楚地Cache-Control
正确设置了标题,并且网络服务器正在设置Etag
.
问题是资源If-None-Match
每次都被有效地忽略Cache-Control
标题。(框架相应地返回 304,但存在往返)。
我读过Etag
标题可能会否决Cache-Control
,即使资源是本地且有效的,仍然会检查匹配项。这对我来说毫无意义。
有谁知道发生了什么?我在这里想念什么?
PD:Web 服务器是一个 Play!应用
django - 当我在 Django 的响应中设置 ETAG 时,为什么 request.META 不包含“HTTP-IF-NONE-MATCH”?
响应代码如下:
没有任何关于IF-NONE-MATCH
下一个的信息request.META
。
有人可以告诉我为什么以及如何?
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(动作动作);
caching - ETag 是否会使 Cache-Control 标头无效?
我正在从我的 RESTful Web 服务中获取资源,并在响应中添加以下两个标头:
浏览器第一次收到此响应时,它会正确缓存 2 分钟。
但是,下次我请求资源时,我的浏览器现在发送了一个IfNoneMatch
标头,并按304 Not Modified
预期得到了一个标头,以及另一个Cache-Control
要缓存 2 分钟的标头。
但是浏览器没有缓存响应。我不断刷新页面,它不断发出请求,因此不断得到304 Not Modified
.
这是正常行为吗?
如何告诉浏览器在获得 2 分钟后重新验证其缓存资源304 Not Modified
,并且不再发出任何请求?