js中的XMLHttpRequest

2019-10-19  本文已影响0人  jadefan

Ajax广泛应用于web网络请求中,它的核心是XMLHttpRequest对象

Ajax,Asynchronous JavaScript + XML简称,能够服务器请求额外的数据而无须卸载页面,会带来很好的用户体验。
XMLHttpRequest对象(简称XHR),首先由微软在IE5中引入,其他浏览器提供商后来都提供了相同的实现。

在XHR出现之前,ajax式的通信必须借助一些hack手段来实现,大多数是使用隐藏的框架或内嵌框架。
XHR向服务器发送请求和解析服务器响应提供了流场的接口,能够以异步方式从服务器取得更多信息。虽然名字中包含XML的成分,但Ajax通信与数据格式无关。

同步请求

示例:

    var url = 'https://www.zhihu.com/commercial_api/banners_v3/home_up?';
    var xhr = new XMLHttpRequest();
    xhr.open('get', url, false);
    xhr.send(null);
    if ((xhr.status >= 200 && xhr.status< 300) || xhr.status == 304) {
      console.log(xhr.response);
    }
异步请求

需先绑定回调函数,示例:

    var url = 'https://www.zhihu.com/commercial_api/banners_v3/home_up?';
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4) {
        if ((xhr.status >= 200 && xhr.status< 300) || xhr.status == 304) {
          console.log(xhr.response);
        }
      }
    }
    xhr.open('get', url, true);
    xhr.send();
open()参数:
  1. 发送请求的类型,"get","post"
  2. 请求的URL
  3. 表示是否异步发送请求的布尔值,false为同步,true为异步
异步回调状态

异步请求时,xhr.readyState的值改变都会触发 onreadystatechange 事件
xhr.readyState代表状态:
0:未初始化,尚未调用open()方法
1:启动,已经调用open(),尚未调用send()
2:发送,已经调用send(),尚未接收到响应
3:接收,已经接收到部分响应数据
4:完成,已经接收到全部响应数据,请求完成
xhr.status 为http状态码,200为请求成功标志,304表示请求的资源没有修改,直接使用浏览器中缓存的版本,其他详细状态查阅协议文档。

HTTP头

每个http请求和响应都会带有相应的头部信息,并提供对应操作头部信息的方法
头部信息包括:

操作请求头部的方法:

超时设定
    xhr.open('get', url, true);
    xhr.timeout = 2000;
    xhr.ontimeout = function () {
      console.log('request time out');
    }
    xhr.send();
跨域请求

受同源策略限制,默认情况下,XHR对象只能访问同域中的资源,这种安全策略可以预防某些恶意行为。但某些情况下需要实现合理的跨域访问资源,就用到了CORS

CORS(Cross-Origin Resource Sharing,跨域资源共享)定义了在必须访问跨域资源时,浏览器与服务器应该如何沟通。

CORS的基本思想是在HTTP头中定义Origin,包含请求页面的源信息,服务器获取后决定是否给予响应。如果认为可以响应,就在Access-Control-Allow-Origin头部中回发相同的源信息。

简单介绍,更多细节后续解析。

上一篇下一篇

猜你喜欢

热点阅读