fetch的使用
一个基本的 fetch请求:
1 | const options = { |
FetchAPI提供了一个全局的 fetch()方法,以及几个辅助对象来发起一个网络请求。
fetch()
fetch()
方法用于发起获取资源的请求。它返回一个 promise
,这个 promise
会在请求响应后被 resolve
,并传回 Response
对象。
headers
可以通过 Headers()
构造函数来创建一个你自己的 headers
对象,相当于 response/request
的头信息,可以使你查询到这些头信息,或者针对不同的结果做不同的操作。
1 | var myHeaders = new Headers() |
Request
通过 Request()
构造函数可以创建一个 Request
对象,这个对象可以作为 fetch
函数的第二个参数。
Response
在 fetch()
处理完 promises
之后返回一个 Response
实例,也可以手动创建一个 Response
实例。
跨域总结
谈到网络请求,就不得不提跨域。
浏览器的同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。
跨域条件:协议,域名,端口,有一个不同就算跨域。
下面是解决跨域的几种方式:
nginx
使用 nginx
反向代理实现跨域.
cors
CORS
是一个 W3C
标准,全称是”跨域资源共享” (Cross-origin resource sharing)
。它允许浏览器向跨源服务器,发出 XMLHttpRequest
请求。
服务端设置 Access-Control-Allow-Origin
就可以开启 CORS
。该属性表示哪些域名可以访问资源,如果设置通配符则表示所有网站都可以访问资源。
1 | app.all('*',function(req,res,next){ |
jsonp
script
标签的 src
属性中的链接可以访问跨域的 js
脚本,利用这个特性,服务端不再返回 JSON
格式的数据,而是返回一段调用某个函数的 js
代码,在 src
中进行了调用,这样实现了跨域。
jquery
对 jsonp
的支持:
1 | $.ajax({ |
fetch、axios
等并没有直接提供对 jsonp
的支持,如果需要使用这种方式,我们可以尝试进行手动封装:
1 | (function(window,document) { |
postMessage跨域
postMessage()
方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。
1 | //捕获iframe |
postMessage
跨域适用于以下场景:同浏览器多窗口间跨域通信、 iframe
间跨域通信。
WebSocket
WebSocket
是一种双向通信协议,在建立连接之后, WebSocket
的 server
与 client
都能主动向对方发送或接收数据而不受同源策略的限制。
1 |
|