正如上面问题所说,当你打开 Chrome 开发工具或者其他抓包工具的时候,会发现一条 POST 请求输出两次,第一次状态显示 OPTION。
一、官方定义
1.OPTIONS 方法是用于请求获得由 Request-URI 标识的资源在请求/响应的通信过程中可以使用的功能选项。
2.该请求方法的响应不能缓存。
3.如果这个 OPTIONS 请求包含一个正文(有 Content-Length 或 Transfer-Encoding 存在),则必须有Content-Type 来指定媒体类型。
虽然规范里没有定义这种正文的用法,但是 HTTP 将来的扩展可能会用它来查询服务器上更详细的信息。
3.如果该 URI 是一个星号(“*”),OPTIONS 请求将试图应用于服务器,而不是某个指定资源。
由于服务器的通信选项通常依赖于资源,所以此“”请求只能作为“ping”或者“no-op”方法;或者用来测试服务器的性能。
例如,用来测试 HTTP/1.1 代理。
4.如果该 URI 不是星号,则只能用来获取该资源通信中可用的选项。
5.得到的 200 响应应该包含一个头域,指明服务器实现的和适用于该资源的可选特征(如:Allow),可能还包括该规范尚未定义的扩展。
如果有响应正文,则应包含关于通信选项的信息。
可以利用内容协商来选择合适的响应格式。如果没有响应正文,响应必须包含 Content-Length,并且值为“0”。
6.请求头的 Max-Forwards 用来请求特定代理。当代理收到一个允许 URI 转发的 OPTIONS请求,则检查Max-Forwards。
如果 Max-Forwards 值为0,则不能转发该消息;相反,代理会将自己的通信选项去响应。如果Max-Forwards 是正整数,代理转发请求的时候会将该值减1。
如果请求中没有 Max-Forwards,转发的请求也不会有。
通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。
二、主要功能
根据上面描述,我们可以列举出 OPTION 的主要功能:
其一:获取服务器支持的 HTTP 请求方法;
其二:用来检查服务器的性能。
值得注意的是:其实 HTTP 请求还分为两类:普通请求和简单请求。
三、结论
那么到这里,大家已经了然于胸了吧!
OPTIONS 请求旨在发送一种“探测”请求以确定针对某个目标地址的请求必须具有怎样的约束(比如应该采用怎样的HTTP方法以及自定义的请求报头),然后根据其约束发送真正的请求。
比如针对“跨域资源”的预检(Preflight)请求采用的 HTTP 方法就是 OPTIONS。
通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。
四、热门文章推荐
3.浏览器存储之争