字节面试官:“OPTIONS方法一般用在哪里?“

250 阅读2分钟

字节面试官问完我 HTTP 一般有哪些请求头之后

我细「嗦」了一下我知道的,然后面试官就问我

"那你知道OPTIONS方法一般用在哪里吗?"

我:"就是用来判断服务器支持啥方法吧。"

“还有吗?”

“没有了”

后面又聊到了跨域问题,面试官让咱详细说一下CORS里面的预监请求。

下来看了才知道,原来 OPTIONS 还可以这样用(

好了那话不多说,我们具体来看看 OPTIONS 能用来干嘛

1. 检测服务器所支持的请求方法

  • 可以使用 OPTIONS 发起请求,以检测服务器支持哪些 HTTP 方法:
curl -X OPTIONS http://example.org -i

这里就会有响应, Allow就是告诉咱这里能够使用啥。

HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Expires: Thu, 20 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
x-ec-custom-error: 1
Content-Length: 0

「小声bb」我测试了一下我自己的服务器,好像因为是从外部访问,返回 405 了

405 Method Not Allowed 就是说咱不被允许访问了

诺,这是它的响应值。

HTTP/2 405 
server: nginx
date: Tue, 01 Nov 2022 05:58:34 GMT
content-type: text/html
content-length: 150

2. 可以用来发送预检请求。

这里我们可以细说一下,举个例子吧~

比如说 CORS 跨域,他分为了简单请求和复杂请求,对于简单请求来说,我们不需要使用 OPTIONS 来发送预检请求,只需要正常发送请求就成。

那什么是简单请求呢?

凡是同时满足以下两种情况的就是简单请求,反之则非简单请求

-   请求方法是以下方三种方法之一
    -   HEAD
    -   GET
    -   POST

-   HTTP的头信息不超出以下几种字段
    -   Accept
    -   Accept-Language
    -   Content-Language
    -   Last-Event-ID
    -   Content-Type:只限于三个值 `application/x-www-form-urlencoded``multipart/form-data``text/plain`
  • 预检请求形式
OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
  • tips:如果简单请求的响应头或者预检请求的响应头没有携带Access-Control-Allow-xxx之类的字段,多半是不能使用跨域(