如何响应HTTP OPTIONS请求?

FtD*_*Xw6 73 http

OPTIONS推测,HTTP 方法用于确定服务器在给定资源上支持的其他方法.鉴于此,我有两个问题:

  • 这种反应是什么样的?我所看到的例子与CSV列出Public,Allow甚至Access-Control-Allow-Methods头.他们都需要吗?有什么不同? RFC 2616在这里似乎没有什么帮助.

  • 使用它来列出资源在非REST-API环境中支持的操作是否合适?例如,如果我ConversionController支持该操作convert,那么这样的响应是否有意义:

请求:

OPTIONS /conversion HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

响应:

HTTP/1.1 200 OK
...
Allow: CONVERT
...
Run Code Online (Sandbox Code Playgroud)

Jul*_*hke 18

RFC 2616定义了"允许"(http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.7)."公共"已不再使用."访问控制允许方法"在CORS规范中定义(参见http://www.w3.org/TR/cors/).

  • 内容怎么样?身体内容可以提供吗? (5认同)
  • @CMCDragonkai是的,`OPTIONS`可能有内容。从RFC 2616开始:“如果OPTIONS请求包括一个实体(如Content-Length或Transfer-Encoding的存在所指示),则媒体类型必须由Content-Type字段指示。尽管此规范未定义任何此类主体的使用,将来的HTTP扩展都可能使用OPTIONS主体在服务器上进行更详细的查询。不支持此类扩展的服务器可能会丢弃请求主体。” (2认同)

Sur*_*gch 10

什么是 HTTP OPTIONS 请求?

这是来自客户端的请求,知道什么HTTP方法服务器将允许一样GETPOST

要求

当询问特定资源的选项时,请求可能如下所示:

OPTIONS /index.html HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

或者在询问服务器时像这样:

OPTIONS * HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

回复

响应将包含一个Allow带有允许方法的标头:

Allow: OPTIONS, GET, HEAD, POST
Run Code Online (Sandbox Code Playgroud)

为什么服务器会收到 HTTP OPTIONS 请求?

  • 一些 REST API 需要它(但如果你正在定义 API,你就会知道)
  • 浏览器将其作为“预检”请求发送到服务器,以查看服务器是否理解CORS
  • 攻击者发送它以获取有关 API 的更多信息

如何响应 HTTP OPTIONS 请求?

  • 您可以使用Allowed标头进行响应,甚至可以在正文中记录您的 API
  • 您可以使用其他 CORS 定义的Access-Control-Request-*标头进行响应。
  • 你可以用405 Method Not Allowed或来回应501 Not Implemented

如何停止接收 HTTP OPTIONS 请求?

  • 如果它来自浏览器,则更新您的 API,使其不会执行任何“危险”操作(例如PUTDELETEPOSTwith application/json)。只执行简单的请求

也可以看看


Haw*_*ker 7

响应标题:"如何响应HTTP OPTIONS请求?" 要回答这个问题,我想知道您为什么要回复OPTIONS请求?谁/什么向您发送OPTIONS请求,为什么? 许多公共服务器以某种形式的"错误"或"不允许"(500,501,405)进行响应.因此,除非您处于特定情况,即您的客户将合理地发送OPTIONS请求并期望返回有用/有意义的信息(例如,WebDAV,CORS),否则您可能希望回答:"不要这样做."

关于"OPTIONS /转换HTTP/1.1"请求的问题:除非您知道您的服务器有一些客户端,否则客户端会向"/ conversion"发送OPTIONS请求并期望响应"Allow:CONVERT" ,"答案是否定的:那样回答是没有意义的.我认为,多数实现支持选项和响应"允许",用标准的HTTP方法作出回应.

这是一篇关于这个主题的精彩文章.

摘要:OPTIONS立即存在问题,因为它不支持缓存.替代方案:服务器范围的元数据:尝试众所周知的URI.特定于资源:尝试在其响应上使用链接标头,或者在该资源的表示格式中使用链接.

最后,如果您所追求的是服务描述,请查看WADLRSDL.

编辑:

dotnetguy在下面的评论中提出了一个很好的观点:OPTIONS在某些情况下无疑是有价值的(例如,CORS); 我当然不打算另有说法.

  • 这篇文章很好,并且有权威,但请参阅"为什么HTTPbis将OPTIONS放入,然后"和评论部分.使用CORS,REST系统应该能够响应OPTIONS,特别是如果要从基于JavaScript的Web应用程序使用API​​.JS框架在实际的HTTP调用之前触发"预检"选项请求是很常见的. (4认同)