XMLHttpRequest(下)

跨域请求

当要在在页面中使用js获取其他网站的数据时,就会产生跨域问题,比如在网站中使用ajax请求其他网站的数据接口时浏览器就会提示以下错误。这种场景下就要解决js的跨域问题。 跨域的方式有多种,比如JSONP,CORS等。

JSONP解决方案

原理是浏览器的script标签是不受同源策略限制(你可以在你的网页中设置script的src属性问cdn服务器中静态文件的路径)。那么就可以使用script标签从服务器获取数据,请求时添加一个参数为callbakc=?,?号是要执行的回调方法。
这样在前端请求脚本,后端将返回的内容以脚本的方式运行,一般是callback(response)的方式,这样就能获取到不同域的数据了

CORS方式

jsonp只能支持GET请求,因为加载脚本的时候只能使用get请求,对于post请求是无法完成的,所以就需要别的方式,比如CORS(跨域资源共享,Cross-Origin Resource Sharing)

CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。比如从www.test1.comwww.test2.com发送请求,则需要在www.test2.com的请求响应头中添加Access-Control-Allow-Origin:*,即允许www.test1.com这个域的请求,这样www.test1.com就可以访问www.test2.com的接口了。

CORS请求默认不发送Cookie和HTTP认证信息,如果需要发送这些信息的话,需要client和server都进行设置,在client中增加xhr.withCredentials = true;,server的响应头中增加header('Access-Control-Allow-Credentials',true),二者缺一不可。而且如果要发送Cookie的话,Access-Control-Allow-Origin就不能设置为*了,必须指定请求来源的域名,而且原网页代码中的document.cookie也无法读取服务器域名下的Cookie。需要服务端设置

如果发送的请求是复杂的请求,比如PUT,DELETE或者Content-Type为application/json,仍然是不能直接请求的,一般会有一次预检请求。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

HTTP Methods

https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

类型 CRUD 描述
GET Read 获取内容
POST Create 创建内容
PUT Update/Replace 全部更新/替换
PATCH Update/Modify 局部更新
DELETE Delete 删除操作

容易混淆的请求类型:

不常用的几种Methods:

HTTP Headers

HTTP头字段,指的是在超文本传输协议 (HTTP)的请求和回复消息中,协议头部分的那些信息。它们定义了某个超文本传输协议事务中的操作参数,如编码类型,解析方式等。自定义专用消息头可通过'X-' 前缀来添加。

请求字段

响应字段

HTTP Header的字段比较多,这里只摘录了比较常见的几个,更多的内容参考List of HTTP header fields

Cache-Control

指定请求和响应中的缓存机制。 缓存指令是单向的,意味着请求中的给定指令不意味着在响应中给出相同的指令。默认是private

请求中的缓存指令

响应中的缓存指令

浏览器对不同缓存指令的响应

浏览器对不同缓存指令的响应

formData

可以通过JavaScript用一些键值对来模拟一系列表单控件,还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是可以异步上传文件.

方法