首页 > 试题广场 >

fetch发送2次请求的原因

[问答题]

面对这个问题,需要先理解三个点:

1. 状态码204:当服务器返回这个状态码时,就表示服务器已经成功收到请求,但是没有数据。对应到浏览器,不会刷新界面,也不会导向新界面。当我们只关注于请求是否成功,而无所谓返回数据时,就可以借助204状态码,省掉了多余的数据传输,从而节省开销。


2. OPTION请求:属于请求中的复杂请求,该类请求有一个特点,在正式发送请求之前,都会先发送一个请求,进行一个预检查,简称:预检请求。


3. 预检请求:可以向服务器请求权限信息,也可以获取目的资源所支持的通信选项(例如:检查HTTP请求方法),还可以用来检查服务器性能。


当你掌握了这三点,关于“fetch发送两次请求”的问题自然也就迎刃而解了。

答案就是当使用fetch发送POST请求时,会先发送一个OPTION请求进行预检查,用来获知服务端是否允许该跨域请求,服务器确认允许之后会返回204状态码,表示允许该跨域请求,这时才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)

编辑于 2021-04-21 20:57:27 回复(0)

<p>fetch发送post请求需要发送两次的原因是,第一次是向服务器发送一个options请求询问服务器是否支持修改请求头,如果可以才在第二次中发送真正的请求</p>

编辑于 2020-05-18 21:33:59 回复(0)
fetch 方法对于HTTP GET方式不会发送两次请求。
fetch 方法对于HTTP POST方式会发送两次请求,第一次使用HTTP OPTIONS方式询问服务器是否支持     所修改的请求头。
发表于 2020-04-03 22:35:39 回复(0)
发送2次请求需要满足以下2个条件:
1.必须要在跨域的情况下
2.除GET、HEAD和POST(content-type: application/x-www-form-urlencoded, multipart/form-data, text/plain Content-Type)以外的跨域请求(我们可以称为预检(Preflighted)的跨域请求)。
总结:
之所以会发送2次请求,那是因为我们使用了带预检(Preflighted)的跨域请求。该请求会在发送真实的请求之前发送一个类型为OPTIONS的预检请求。预检请求会检测服务器是否支持我们的真实请求所需要的跨域资源,唯有资源满足条件才会发送真实的请求。比如我们在请求头部增加了authorization项,那么在服务器响应头中需要放入Access-Control-Allow-Headers,并且其值中必须要包含authorization,否则OPTIONS预检会失败,从而导致不会发送真实的请求
发表于 2022-09-03 17:07:51 回复(0)
<p>fetch发送post请求,第一次会发个option请求询问服务器是否支持修改请求头,然后再发一次真正的请求</p>
发表于 2020-08-29 15:06:14 回复(0)