- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
分解条件 GET 的组成部分:
在RFC 2616它声明如果请求消息包含 If-*
(If-Modified-Since
, If-Unmodified- Since
、If-Match
、If-None-Match
或 If-Range
) header 字段。
然后说:
A conditional GET method requests that the entity be transferred ONLY under the circumstances described by the conditional header field(s).
根据我的理解,这是说如果 condition 在任何新的后续请求中满足“If-*
”,它只会返回请求的数据。例如,如果 GET 请求返回带有 Etag
header 的响应,那么下一个请求必须包含带有 ETag
的 If-None-Match
将客户端传回所请求资源的值。
但是,如果客户端必须在获取返回的“ETag
” header (以返回 If-None-Match
)之前发送初始请求,那么他们已经拥有请求的资源。因此,任何返回带有 ETag
值的 If-None-Match
header 的 future 请求仅指示请求值的返回,返回 200 OK(如果客户端未从初始请求返回 If-None-Match
和 ETag
值)或 304 Not Modified(如果返回),这通过缓存资源来帮助客户端和服务器。
我的问题:
如果如果- *
条件满足(就像在我的示例中,客户端返回带有 If-None-Match
的 ETag
值以缓存请求的资源)如果返回资源或“实体”时是否返回“If-*
”?它不会返回资源“仅在条件 header 描述的情况下”因为它返回资源尽管返回200 OK 或 304 Not Modified 取决于是否返回“If-*
” header 。我对此有什么误解?
来自 RFC 2616 的完整条件 GET 引用:
The semantics of the GET method change to a "conditional GET" if the request message includes an If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. A conditional GET method requests that the entity be transferred only under the circumstances described by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network usage by allowing cached entities to be refreshed without requiring multiple requests or transferring data already held by the client.
最佳答案
首先,请注意 RFC 2616 已过时,您应该引用 RFC 7232 .
很难看出到底是什么让您感到困惑。所以让我用例子来说明。
客户 A:我需要 http://example.com/foo/bar
。
GET /foo/bar HTTP/1.1
Host: example.com
服务器:给你。
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 12
ETag: "2ac07d4"
Hello world!
(一段时间过去了)
客户 A:我再次需要 http://example.com/foo/bar
。但是我的缓存中已经有了 "2ac07d4"
版本。也许这样就可以了?
GET /foo/bar HTTP/1.1
Host: example.com
If-None-Match: "2ac07d4"
服务器:是的,"2ac07d4"
没问题。只需从您的缓存中取出它,我不会将其发送给您。
HTTP/1.1 304 Not Modified
客户 A:我需要 http://example.com/foo/bar
。
GET /foo/bar HTTP/1.1
Host: example.com
服务器:给你。
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 12
ETag: "2ac07d4"
Hello world!
(一段时间过去了)
客户端 B:我想上传新版本的 http://example.com/foo/bar
。
PUT /foo/bar HTTP/1.1
Content-Type: text/plain
Content-Length: 17
Hello dear world!
服务器:这看起来不错,我正在保存它。我将此版本称为 “f6049b9”
。
HTTP/1.1 204 No Content
ETag: "f6049b9"
(更多时间流逝)
客户 A:我再次需要 http://example.com/foo/bar
。但是我的缓存中已经有了 "2ac07d4"
版本。也许这样就可以了?
GET /foo/bar HTTP/1.1
Host: example.com
If-None-Match: "2ac07d4"
服务器:抱歉,"2ac07d4"
已过期。我们现在有一个新版本,它叫做 "f6049b9"
。来,我发给你。
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 17
ETag: "f6049b9"
Hello dear world!
A conditional GET method requests that the entity be transferred ONLY under the circumstances described by the conditional header field(s).
考虑客户 A 的第二个请求(在两种情况下)。
条件头字段是:If-None-Match: "2ac07d4"
。
它描述的情况是:“资源的选定表示不匹配实体标签“2ac07d4”
”。
场景 1:情况不成立,因为所选的资源表示(包含 Hello world!
的表示)确实匹配实体标签 “2ac07d4”
。因此,根据协议(protocol),服务器不会在其响应中传输实体。
场景 2:情况确实成立:资源的选定表示(包含 Hello dear world!
的表示)与实体标签 不匹配“2ac07d4”
(它匹配 “f6049b9”
)。因此,根据协议(protocol),服务器确实在其响应中传输实体。
无论如何,服务器是如何生成这些"2ac07d4"
和"f6049b9"
的?当然,这取决于应用程序,但一种直接的方法是计算实体主体的哈希值(例如 SHA-1)——即使引入很小的变化,该值也会发生巨大变化。
关于get - 如果资源是在初始请求中获取的,是什么让条件 GET 为 "conditional"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33682533/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!