XMLHttpRequest

一、概念
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章

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值