【问题标题】:RESTful API methods; HEAD & OPTIONSRESTful API 方法;头部和选项
【发布时间】:2011-10-03 08:28:25
【问题描述】:

我正在用 PHP 为一个应用程序编写一个 RESTful API 模块,我对动词 HEADOPTIONS 有点混淆。

  • OPTIONS  用于检索给定资源的可用 HTTP 动词?
  • HEAD 用于判断给定资源是否可用?

如果有人能澄清*这些动词,那将不胜感激。

* 说明是关于重新利用 HTTP 动词的 RESTful API 架构。从那以后,我意识到HEADOPTIONS 都应该被重新使用,而是像任何HTTP 应用程序一样表现出可预测的行为。哦,我们如何在 2 年内成长。

【问题讨论】:

  • 可能是因为 HTTP 规范在网络上很容易获得。
  • @Gordon - 很公平,虽然我了解 RESTful API 服务旨在利用现有的 HTTP 规范,但我想我推测实现细节存在一些偏差。我的错。
  • 大多数东西的规格都可以在网上找到。关于 SO 的问题是为了在文档之外进行澄清。这很符合。

标签: php http rest


【解决方案1】:

OPTIONS 方法返回有关 API 的信息(方法/内容类型)

HEAD 方法返回关于资源(版本/长度/类型)的信息

服务器响应

选项

HTTP/1.1 200 OK
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:24:43 GMT
Content-Length: 0

头部

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:12:29 GMT
ETag: "780602-4f6-4db31b2978ec0"
Last-Modified: Thu, 25 Apr 2013 16:13:23 GMT
Content-Length: 1270
  • OPTIONS 识别资源支持的 HTTP 方法,例如我们可以通过 PUT 删除或更新它吗?
  • HEAD 检查资源是否已更改。这在维护资源的缓存版本时很有用
  • HEAD 检索有关资源的元数据,例如在进行可能昂贵的检索之前,它的媒体类型或大小
  • HEAD, OPTIONS 测试资源是否存在且是否可访问。例如,在应用程序中验证用户提交的链接

Here 是一篇关于 HEAD 和 OPTIONS 如何融入 RESTful 架构的简洁明了的文章。

【讨论】:

  • 很好的答案,太糟糕了,它会支付迟到的罚款。复制粘贴的公认答案甚至没有开始专门解决这些动词在 RESTful 架构中的位置。
  • 您的链接已失效。这是它的最后一张快照:web.archive.org/web/20160528151316/https://…
【解决方案2】:

根据:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

9.2 选项

OPTIONS 方法表示请求有关在由 Request-URI 标识的请求/响应链上可用的通信选项的信息。此方法允许客户端确定与资源相关的选项和/或要求,或服务器的功能,而无需暗示资源操作或启动资源检索。

对此方法的响应不可缓存。

如果 OPTIONS 请求包括一个实体主体(如 Content-Length 或 Transfer-Encoding 的存在所示),则媒体类型必须由 Content-Type 字段指示。尽管本规范没有定义这种主体的任何用途,但 HTTP 的未来扩展可能会使用 OPTIONS 主体在服务器上进行更详细的查询。不支持此类扩展的服务器可能会丢弃请求正文。

如果 Request-URI 是星号(“*”),则 OPTIONS 请求通常适用于服务器而不是特定资源。由于服务器的通信选项通常取决于资源,因此“*”请求仅用作“ping”或“no-op”类型的方法;除了允许客户端测试服务器的功能之外,它什么也不做。例如,这可用于测试代理的 HTTP/1.1 合规性(或不合规性)。

如果 Request-URI 不是星号,则 OPTIONS 请求仅适用于与该资源通信时可用的选项。

200 响应应该包含任何标头字段,这些字段指示服务器实现的并适用于该资源的可选功能(例如,允许),可能包括本规范未定义的扩展。响应正文(如果有)还应包括有关通信选项的信息。本规范未定义此类主体的格式,但可能由 HTTP 的未来扩展定义。内容协商可用于选择适当的响应格式。如果未包含响应正文,则响应必须包含字段值为“0”的 Content-Length 字段。

Max-Forwards 请求头字段可用于定位请求链中的特定代理。当代理在一个absoluteURI 上接收到一个允许转发请求的OPTIONS 请求时,代理必须检查Max-Forwards 字段。如果 Max-Forwards 字段值为零(“0”),则代理不得转发消息;相反,代理应该使用自己的通信选项进行响应。如果 Max-Forwards 字段值是大于零的整数,则代理在转发请求时必须减少字段值。如果请求中不存在 Max-Forwards 字段,则转发的请求不得包含 Max-Forwards 字段。

9.4 头部

HEAD 方法与 GET 相同,只是服务器不得在响应中返回消息体。响应 HEAD 请求的 HTTP 标头中包含的元信息应该与响应 GET 请求发送的信息相同。此方法可用于获取有关请求所隐含的实体的元信息,而无需传输实体主体本身。这种方法通常用于测试超文本链接的有效性、可访问性和最近的修改。

对 HEAD 请求的响应可能是可缓存的,因为响应中包含的信息可以用于从该资源更新先前缓存的实体。如果新字段值表明缓存的实体与当前实体不同(如 Content-Length、Content-MD5、ETag 或 Last-Modified 的变化所表明的那样),则缓存必须将缓存条目视为陈旧的。

【讨论】:

  • 感谢@sdolgy 的全面报价;然而,在实践中,许多成功的 RESTful API 模块是否(应该)遵守所有这些 HTTP 标准,或者这些操作是否存在可接受的 slim 响应?不是出于懒惰,而是出于好奇;我可能会实施一切必要的坚持。
  • 如果您正在构建自己的,我假设您是,您应该尝试与文档化标准保持一定的一致性,以使您的生活更轻松......以及使用您的 api 的人......不要不要跟随微软。与 RFC 保持一致是件好事
  • 谢谢@sdolgy。在简要介绍了链接的文档后,我注意到末尾有 CONNECT 动词。使用该方法进行 RESTful 身份验证会是一个糟糕的选择吗?
  • 不确定这是预期目的“本规范保留方法名称 CONNECT 用于可以动态切换为隧道的代理(例如 SSL 隧道 [44])。” ... 可能在 stackexchange.com 网站上发布另一个关于它的问题会有所帮助...
  • @DanLugg 您的应用程序可能没有以 SSL 隧道的方式使用 CONNECT,但想象一下,如果您的应用程序的消费者有一个代理以原来的方式实现 CONNECT 会发生什么在 RFC 中指定,请求可能不会传递到您的应用程序。
【解决方案3】:

OPTIONS 告诉您诸如“此资源允许使用哪些方法”之类的信息。

HEAD 获取您发出 GET 请求时将获得的 HTTP 标头,但没有正文。这让客户端可以确定缓存信息、返回什么内容类型、返回什么状态码。可用性只是其中的一小部分。

【讨论】:

  • 感谢@Quentin; OPTIONS 是我的想法,使用我现有的方法可以轻松实现。根据 sdolgy 的 RFC 引用,OPTIONS 没有在格式中定义标准。是否假定响应格式与其他响应相同? (例如;JSON、XML 等
  • @Tomcat 引用 RFC:“内容协商可用于选择适当的响应格式。”换句话说:响应应该是请求头中要求的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2014-08-08
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
相关资源
最近更新 更多