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 |
|