VueBloghyhero6

关于axios 请求接口发起俩次请求的问题

2019-11-29 / 2019-11-29 / 311次浏览

这个月基本没有什么产出,在这里愧对服务器画的钱,开花谢罪了。
好的,废话少说,进入正题,这个月是这样的,笔记当中记录了一些axios 的相关知识点。

这个问题的发现是这样的,在某天调试nuxt本地的时候,发现了一个bug问题,axios 相关会发起二次请求。仔细的去看了一眼请求头,我发现了问题。
axios 请求接口发起两次请求(OPTIONS 与 POST/GET)

没有错, 它会发送一次预请求 OPTIONS。 那么我当时就在思考一个问题,问题是有的时候发,有的时候为什么又不发呢。

说起这个问题,就可能会扯到,跨越资源共享(CORS),这个东西能一般是后端同学配置好。前端同学直接跨域请求使用。

例如,参考文档上的说法,

跨域资源共享 (CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器,让运行在一个 origin (domain)上的Web应用被准许访问来自不同服务器上的指定的资源。当一个资源从与该资源本身的所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域HTTP请求。比如,站点 http://domain-a.com 的某HTML 页面 通过 的 src 请求 http://domain-a.com/image.jpg.网络上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。

出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如, XMLHttpRequest 和 Fetch API 遵循同源策略。 这就意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确的CORS响应头。

跨域资源共享 (CORS) 机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttp Request 或 Fetch)使用 CORS, 以降低跨域HTTP请求带来的风险。

由于本地跨域所以做出 一次 OPTIONS 请求,服务器就不会了因为服务不存在跨域

若干访问控制场景

这里,我们使用三个场景来解释跨域资源共享机制的工作原理。这些例子都使用 XMLHttpRequest 对象。

简单请求

某些请求不会触发 CORS 预检请求,本文称这样的请求为“简单请求”,请注意,该术语并不属于Fetch(其中定义了CORS)规范。若请求满足所有下述条件,则该请求可视为“简单请求”:

使用下列方法之一:

GET

HEAD

POST

Fetch 规范定义了对CROS 安全的首部字段集合,不得人为设置该集合之外的其他首部字段。该集合为:

Accept

Accept-Language

Content-Language

Content-Type(需要注意额外限制)

DPR

Downlink

Save-Data

Viewport-Width

Width

Content-Type 的值仅限于下列三者之一:

text/plain

multipart/form-data

application/x-www-form-urlencoded

请求中任意 XMLHttpRequestUpload 对象均没有任何时间监听器;

XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问

说了这么多,就是因为出现了跨域,导致了axios 发预检请求,由于它发了预检请求,所以我们看到它的请求是俩次。

大多数也是查的资料写的并不好, 结尾说一句,其实不让axios 发送预检也是可以的,但是预检没有害处。 如果服务上线之后就部署在同一个服务器,那么,预检请求自己就会消失(不存在跨域了)

以下是参考资料

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types

https://blog.csdn.net/qq_27626333/article/details/77005911

https://blog.csdn.net/qq_27626333/article/details/77005911

感谢观看。。。