HTTP的隐藏特性

87

您认为HTTP的哪些隐藏功能值得提及?

所谓隐藏功能,指的是已经成为标准但广泛未知或未被使用的功能。

每个答案请只列举一个功能。

13个回答

124

我最喜欢的状态码一定是418我是茶壶,它是超文本咖啡壶控制协议(HTTP的扩展)的一部分。每次看到都会让我笑。

2.3.2 418 我是茶壶

任何试图使用茶壶煮咖啡的尝试都应该返回错误代码“418我是茶壶”。结果的实体主体可以是短小而且健壮的。


3
我已经在脚本中实现了这个状态,当没有适合的其他状态时使用。 - eyelidlessness
4
根据RFC:“生成的实体主体可以是短而粗壮的。” - Piskvor left the building
2
我编写了自己的HTTP服务器,并确保实现了这一点。 - Matt Joiner
这不是他们编写用于向咖啡机发送命令的真正协议吗?我确定我在某个地方看到过! - 他们构建了一台咖啡机,以通过该协议接受命令,因此实际上它是一个合法的协议。 - RobertPitt

48

因为引用者一词拼错,决定保留这个错误的拼写。


42

明显的答案:PUT、DELETE、TRACE、OPTIONS、CONNECT方法

大多数人知道GET和POST方法,因为这是构建表单时使用的方法。浏览器也经常使用HEAD方法。其他方法则很少被人所知;它们主要被一些更特定的应用程序所使用。


1
很好的回答,你能提供更多关于所有方法的信息吗? - Louis
2
你可以在各种网站上阅读有关此内容的所有信息,例如http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol。 - Martijn
1
不幸的是,有多少浏览器支持这些方法?(我知道,很遗憾) - Pascal Qyy
为什么这些列表中从来没有包括PATCH? - tobib

29

17
好的。在HTTP<->短信网关中,如果您的预付费余额用完了,您将开始收到402响应。 - Kornel
27
@zildjohn01说:“那意味着……戏剧性的停顿……我们正在生活在未来!” ;) - Piskvor left the building
6
精辟的观察。我也要指出,我拒绝接受这个未来和它可悲的软件堆栈。 - Matt Joiner
3
未来已经来了,只是分布不均。 - XTL

25

204无内容

我认为204只是在没有内容可以显示时使用的,但规范似乎还有额外的行为,即用户代理“不改变其文档视图”。

根据如何配置Apache以返回HTTP 204(无内容)进行AJAX

顺便说一句,Google实际上做了类似的事情。每次用户点击他们搜索结果中的链接时,Google会ping自己以记录点击;来自ping的响应代码是HTTP 204。

此外,204 No Content提出如果您想节省每一个网络流量字节,则这是“Web Bug”或“Beacon”的好技术。


17

响应代码410 Gone:

(...) 服务器所有者希望移除对该资源的远程链接。 (...)

Web蜘蛛(尤其是Google)会在下一次抓取时取消索引返回410状态码的页面。


16

在动态内容中使用Last_Modified或ETag头部

有时,您会有一些生成成本高昂且可能不会在请求之间更改的大型动态内容。您可以在生成的响应中添加一个Last_Modified或ETag头部。

在您昂贵的动态代码的顶部,您可以使用If_Modified_Since或If_None_Match来确定请求者所拥有的内容是否仍然是当前的。如果是,则将响应状态更改为"304未修改"并结束请求。

一些服务器端技术提供这样的功能,但即使在低级的ASP-Classic中,您也可以执行以上操作。

请注意,这与设置Cache-Control、Expires头部不同,因为它确保客户端始终具有关于请求的最新信息。


13
您可以使用 RangeIf-Range 请求头,分别带有指定的字节范围和唯一文件标识符或文件修改时间戳来请求恢复(大型)HTTP响应(例如文件下载)。如果服务器已在初始响应中发送了 Accept-Ranges: bytesETagLast-Modified 响应头,分别用于通知服务器支持字节范围请求、唯一文件标识符和文件修改时间戳,则可以实现这一点。

初始响应可能如下所示(ETag 通常由文件名、大小和最后修改时间戳组成):

Accept-Ranges: bytes
ETag: file.ext_1234_1234567890
Content-Range: bytes 0-1233/1234

如果下载在例如1KB(1024字节)处中止,客户端可以按以下方式恢复它:

If-Range: file.ext_1234_1234567890
Range: bytes=1024-

应该返回这个响应,其中包含正确的字节数:

Accept-Ranges: bytes
ETag: file.ext_1234_1234567890
Content-Range: bytes 1024-1233/1234

1兆字节(Mbyte)= 1024千字节(kbytes),1千字节(kbyte)= 1024字节,这意味着1兆字节(Mbyte)= 1024 * 1024字节。 - Maerlyn

12

ReST 尝试将HTTP推到极限作为接口协议。

它不是一个隐藏的特性,但从阅读定义明确的ReST API中,可以很好地掌握HTTP应该如何工作,并找到许多使用简单的HTTP方法、状态码和头部组合实现的精彩示例。


9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接