一、概念
1.XHR:XHR的每个实例都表示一个独立的请求/响应对,并且这个对象的属性和方法允许指定请求细节和提取响应数据。
2.请求分为两类:
- 指定请求get:用于常规请求,适用于当URL完全指定请求资源,当请求对服务器没有任何副作用以及当服务器的响应是可缓存时;
- 取得响应post:常用于HTML表单,它在请求主体中包含额外数据,且这些数据常存储到服务器上的数据库中。
3.结构
(1)一个HTTP请求
- HTTP请求方法
- 一个可选的请求头集合(可能包括身份验证信息)
- 一个可选的请求主体
(2)服务器返回的HTTP响应
- 一个数字和文字组成的状态码(显示请求的成功和失败)
- 一个响应头集合
- 响应主体
4.HTTP的基础请求/响应架构的复杂问题:客户端和服务端交换cookie,服务器重定向浏览器到其他服务器,缓存某些资源而剩下的不缓存,某些客户端通过代理服务器发送所有的请求等。(cookie,重定向,缓存和代理四个方面)
二、XHR使用
1.get
var request=new xMLHttpRequest();//实例化XHR对象
request("GET","data.csv");//开始一个HTTP GET请求
request.send(null);//get请求没有请求主体,应该传递null或省略这个参数
2.post
function postMessage(msg){
var request=new XMLHttpRequest();//新请求
request.open("POST","/log.php");//用post向服务器端发送脚本
request.setRequestHeader("Content-Type","text/plain;charset=UTF-8"); //设置请求头,Content-Type指定请求主题的MIME类型
request.send(msg);//把msg作为请求主体发送
}
三、XHR方法
1.open():指定请求的方法和URL。
2.setRequestHeader() :设置请求头。
3.send(): 启动请求(异步处理HTTP响应)。
4.getResponseHeader()和getAllResponseHeaders():查询响应头。
5.readystatechange
四、XHR属性
1.status和statusText属性:以数字和文本的形式返回HTTP状态码。例如,200和"OK"表示成功请求,404和"Not Found"表示URL不能匹配服务器上的任何资源。
2.responseText和responseXML属性:得到文本形式和document形式的响应主体。
3.readyState属性:指定了HTTP请求的状态。每次该属性改变都会触发readystatechange事件。
4.onreadystatechange属性:为了监听readystatechange事件,要把事件处理函数设置为XHR对象的onreadystatechange属性。
例如,
request.onreadystatechange=function(){
if(request.readyState===4 && request.status===200){
...
}
}
五、JSON编码的请求
function postJSON(url,data,callback){
var request=new XMLHttpRequest();
request.open("POST",url);
request.onreadystatechange=function(){
if(request.readyState===4 && callback)
callback(request);
};
request.setRequestHeader("Content-Type","application/json");
request.send(JSON.stringify(data));
}
六、HTTP进度事件
1.过程:
- 当调用send()时,触发单个loadstart事件。
- 当正在加载服务器的响应时,XHR对象会发生progress事件。通常每隔50毫秒左右,所以可以使用这些事件给用户反馈请求的进度。请求快速完成,可能从不触发progress事件。
- 当事件完成,会触发load事件。
2.HTTP请求无法完成:
- 如果请求超时,会触发timeout事件。
- 如果请求中止,会触发abort事件。
- 网络错误(如太多重定向)会阻止请求完成,会触发error事件。
3.progress事件相关联的事件对象的属性:
- loaded:目前传输的字节数值
- total:"Content-Length"头传输的数据的整体长度
- lengthComputable:知道内容长度,则属性值为true,否则为false
七、跨域HTTP请求
1.概念:通常仅可以发起和文档具有相同服务器的HTTP请求。
2.原因:可以在<iframe>
和<form>
元素中使用跨域URL,而浏览器显示最终的跨域文档。但因为同源策略,浏览器不允许原始脚本查找跨域文档的内容。使用XHR,文档内容都是通过responseText属性暴露,所以同源策略不允许XHR进行跨域请求。
3.XHR2通过在HTTP响应中选择发送合适的CORS(Cross-Origin Resource Sharing,跨域资源共享)允许跨域访问网站。
4.实现CORS的安全细节:
- 给open()方法传入用户名和密码,那么它们绝对不会通过跨域请求发送。
- 跨域请求通常也不会包含其他任何的用户证书:cookie和HTTP身份验证令牌token通常不会作为请求的内容发送,且任何作为跨域响应来接收的cookie都会丢弃。
——阅读《Javascript权威指南》第18章