发送同步请求
一、open()方法
使用XHR 对象时,
首先,要调用open()方法,它 接收3个参数: 要发送的请求的类型、请求的URL和表示是否异步发送请求的布尔值。xhr.open("get","example.php",false);
说明:这行代码会启动一个针对example.php 的get请求。需要注意的是:
- URL是相对于执行代码的当前页面或者可以使用绝对路径。
- 调用open()方法并不会真正的发送请求,而是启动一个请求以备发送。
二、send() 方法
1、 要发送特定的请求,必须像下面这样调用send() 方法:
//这里设置请求去是同步的,所以js代码会在等到服务器响应之后才继续执行。xhr.open("get","example.txt","false");xhr.send(null);
注意:这里的send() 方法接收一个参数,即作为请求主体发送的数据。如果不许要,则必须传入null,因为这个参数对于某些浏览器是必须的。
2、 调用send()方法之后,请求就会被分派到服务器上。
三、收到响应
1、 在收到响应后,响应的数据会自动填充XHR 对象的属性:
- responseText:作为响应主体被返回的文本。
- responseXML:如果响应的内容类型是“text/xml"或"application/xml",这个属性中将保存包含着响应数据的XML DOM文档。
- status:响应的HTTP状态。
- statusText:HTTP状态的说明。
2、访问 repsonseText
-
在接收到响应后,第一步检查status属性,以确定响应已经成功返回(http为200)。
-
此时,responseText 作为响应主体被返回的文本。
-
如果 responseText 的内容类型为“text/xml"或"application/xml", 那么,repsonseXML便可以访问。
-
此外,如果状态码为304,那么可以直接使用浏览器中缓存的版本。响应也是有效的。
3.、检查状态码
为确保接收到适当的响应,应该像下面 这样检查这两种状态代码:
var xhr = createXHR();xhr.open("get", "example.txt", false);xhr.send(null);if((xhr.status >=200 && xhr.status <300) || xhr.status ==304) { alert(xhr.responseText);}else { alert("Request was unsuccessful:" + xhr.status);}
注意:
一般通过检测status来决定下一步操作。不要依赖 statusText,因为这个在跨浏览器使用时不太可靠。 如果响应的数据不是XML,那么就只保存到responseText中,而responseXml的值将为null。 此外,有些浏览器会报204状态码,其中ie非原生XHR会将204设置为1223,而原生XHR会将204规范为200。Opera会将204报告为status为0。发送异步请求
发送异步请求,就是让javascript 继续执行而不必等待响应。
可以通过检测XHR 对象的 readyState属性,该属性标识请求、响应过程的当前的活动阶段。
这个可取的值如下:
0:未输出化。尚未调用open()方法。
1:启动。已经调用open()方法,但未调用send()方法。 2:发送。已经调用send()方法,但未接收到响应。 3:接收。已经接收到响应数据。 4:完成。已经接收到全部响应数据,而且可以在客户端使用了。注意:
只要readyState 属性的值有一个值变成另一个值,都会出发一次readystatechange 事件。 可以利用这个事件来检测每次状态变化后 readyState 的值。
通过只检测readyState 值为4的阶段。不过必须在调用open()之前 制定 onreadystatechange 事件处理程序时才能确保跨浏览器兼容性。
例子:
var xhr = createXHR();xhr.onreadystatechange = function () { if(xhr.readyState ==4) { if((xhr.status>= 200 && xhr.status <300)|| xhr.status==304) { alert(xhr.responseText); } else { alert("Request was unsuccessful:" + xhr.status); } }}xhr.open("get", "url", true);xhr.send(null);
说明:
以上代码利用DOM 0 级方法为XHR 对象添加了事件处理程序,原因是并非所有浏览器都支持DOM2 级方法 。 与其他事件处理程序不同,这里没有向 onreadystatechange 事件处理程序中传递event 对象;必须通过XHR 对象本身来确定下一步该怎么做。注意:
不要使用this 对象,需要用xhr对象。如果使用this对象,在有的浏览器中可能发生错误。使用实际的XHR对象实例变量是较为可靠的一种方式。此外:
在接收到响应之前可以调用 abort()方法来异步请求,xhr.abort();
调用这个方法后,XHR 对象会停止触发实践。在终止请求后,还应该对XHR对象进行解引用。 因为,由于内存问题,不建议XHR 对象。
获取 HTTP 头部信息
每个HTTP请求和响应都带有相应的头部信息,XHR 也提供了操作这两种头部信息的方法。
默认情况下,在发送XHR 请求的同时,还会发送的下列头部信息。 Accept: Accept-Charset: ...
使用 setRequestHeader() 方法可以设置自定义的请求头部信息。
注意,setRequestHeader() 必须在调用open() 方法之后且调用 send() 方法之前调用。调用 XHR 对象的getResponseHeader()方法并传入头部字段名称,可以取得相应的响应头部信息。
调用getAllResponseHeaders()方法则可以取得一个包含所有响应头部信息的长字符串。...xhr.open("get","example.php",true);xhr.setRequestHeader("MyHeader","MyValue");xhr.send(null);//-----------------------------var myHeader = xhr.getResponseHeader("MyHeader");
在没有自定义信息的情况下,getAllResponseHeaders() 方法通常会返回如下所示的多行文本内容:
Content-Type: text/htmlServer: WebStorm 2016.3.1Date: Fri, 25 Nov 2016 15:02:10 GMTX-Frame-Options: SameOriginX-Content-Type-Options: nosniffx-xss-protection: 1; mode=blockCache-Control: private, must-revalidateLast-Modified: Fri, 25 Nov 2016 15:02:10 GMTContent-Length: 1894