资讯专栏INFORMATION COLUMN

ajax初探

cangck_X / 2048人阅读

摘要:在看了一些文章之后,对有了初步的一些了解。所以应该尽量避免使用同步请求。所以在同步请求的情况下,是无法进行跨域的。默认值是空字符串只有请求完成时,该属性才会有正确的值如果请求没完成,该属性的值可能是或。表示请求的方式,或者是。

在看了一些文章之后,对Ajax有了初步的一些了解。Ajax的定义不用多说,主要记录一下Ajax的简单实现。
第一种方式是通过xhr(XMLHttpRequest)方式来发送Ajax请求。最基础简单的步骤是三步:创建一个xhr对象;调用open()方法,调用send()方法。
创建一个xhr对象是再简单不过的了 var xhr = new XMLHttpRequest();

open()方法是创建一个请求 xhr.open("POST","/serve",true);
open()方法有三个参数,分别是:

method: 请求的方式,如GET/POST,该参数不区分大小写;

url: 请求的地址,该地址可以是相对的(相对于当前网页的url路径),也可以是绝对的;

async: 默认值为true,即为异步请求,若async=true,则表示为同步请求。

一般默认使用的是异步请求。同步请求的时候会出现一些限制:

xhr.timeout = 0;
xhr.withCredentails = false;
xhr.responseType = "";

不满足以上任意一个限制,就会抛出错误。

xhr.timeout 设置请求超时时间,如果值为0,说明不限时,在这样的情况下,如果服务器一直没有响应,会出现页面堵塞的情况,会影响用户的其它交互。所以应该尽量避免使用同步请求。

xhr.withCredentails 跨域请求设置 默认值为false。跨域请求的时候需要手动设置为true。所以在同步请求的情况下,是无法进行跨域的。

xhr.responseType 设置请求返回的数据格式 这个属性是在xhr标准2中才有的,在标准1里面提供的是 overrideMimeType()方法。
overrideMimeType()方法的作用是重写response的content-type。比如说,Server端给客户端返回了一份document或xml文档,但希望的是通过 xhr.response拿到的是一个DOM对象,那么就可以通过xhr.overrideMimeType("text/xml;charest = utf-8")来实现。
responseType用来指定xhr.response的数据类型,默认的xhr.response的数据类型是String字符串。不同的responseType的值对应不同的数据类型,如"text"对应String字符串;"document"对应Document对象;"json"对应JavaScript对象;"blob"对应Blob对象;"arrayBuffer"对应ArrayBuffer对象。
虽然在标准2中,2种方式都存在,且都可以设置响应返回的数据格式,但明显xhr.responseType功能强大很多,也方便使用,能做到xhr.overrideMimeType()所做到的。

除了上面提到的xhr.response,xhr提供了另外2种属性来获取请求返回的数据:xhr.responseText;xhr.responseXML。

xhr.response
默认值是空字符串"";
只有请求完成时,该属性才会有正确的值;
如果请求没完成,该属性的值可能是""或null。(具体的值跟responseType的值有关,如果responseType的值为""或"text",属性的值为"";否则值为null)

xhr.responseText
默认值是空字符串"";
只有当responseType为""或"text"时,才能调用该属性,否则会抛出错误;
只有请求成功时,才有正确值,否则值为空字符串""

xhr.responseXML
默认值为null;
只有当responseType为""、"text"、"document"时,才能调用该属性,否则会抛出错误;
只有请求成功并返回数据被正确解析时,才有正确值,否则值为null

send()方法是发送数据 xhr.send(data);
send()方法的参数data有6种类型:ArrayBuffer;Blob;Document;DOMString;FormData;null。 如果是GET请求,一般不传参数或者传null参数。如果是在断网情况下,该方法会抛出错误,所以调用该方法的时候,需要用try-catch来捕获异常。

try{
    xhr,send(data);
}catch(e){
  //...
};

请求发送之后还要处理请求返回的数据,可以调用onload()方法或者onreadystatechange()方法。readyState这个属性可以追踪Ajax请求的当前状态,这个属性是可读属性,总共有5种不同的值(0-4),分别对应xhr的不同阶段,如3表示LOADING(正在下载响应体)。每次xhr.readyState的值发生变化的时候,都会触发xhr.onreadystatechange()事件。

完整例子如下:

 var xhr = new XMLHttpRequest();
        xhr.responseType = "json";
        xhr.open("GET", "https://cnodejs.org/api/v1/topics", true);
        xhr.onload = function () {
            //如果请求成功
            if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304)             
            {
                var res = this.response;
                console.log(res);
                //do successCallback
            }
        }
        xhr.send();

第二种方式是通过fetch来发送Ajax请求
通过fetch获取后台数据的代码很简单,它会返回一个Promise对象,有多个参数。

url 请求的地址,该参数为必选。

method 表示请求的方式,GET或者是POST。

body POST请求的参数,需要放在body里面,而GET请求的参数可以直接放在URL中

headers 设置请求的头信息,可在里面放指定的提交方式、指定的获取类型等信息

默认情况下,fetch不会从服务端发送或接收任何cookies。
如果要发送cookies,必须发送凭据头。

 fetch("https://cnodejs.org/api/v1/topics",{
            method: "GET",
            credentials: "include",
        })
        .then((res)=>{
            return res.json()
        })
        .then((res)=>{
            console.log(res);
        })

完整例子如下:

fetch("https://cnodejs.org/api/v1/topics",{
            method: "GET",
            headers: new Headers({
                "Accept": "application/json"
            })
        })
        .then((res)=>{
            return res.json()
        })
        .then((res)=>{
            console.log(res);
        })

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93483.html

相关文章

  • Mocha 和 Chai 入门初探

    摘要:转载自楼主个人博客和入门初探在和作比较的时候两者主要的不同就是的集成度比较高内置断言库而需要搭配额外的断言库在此选择了比较流行的作为断言库风格的选择其中又有好几种断言风格我们经常见到的其实就是风格的其中我较喜欢因为它可以直接以属性的方式嵌入 转载自楼主个人博客 Mocha 和 Chai 入门初探 Chai 在和 jest 作比较的时候, 两者主要的不同就是 jest 的集成度比较高内置...

    caoym 评论0 收藏0
  • 初探WebSocket

    摘要:流控制通常就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。和长链接以上几种服务器推的技术中长轮询和流控制其实都是基于长链接来实现的,也就是中所谓的。通信协议于年被定为标准,并被所补充规范。 初探WebSocket node websocket socket.io 我们平常开发的大部分web页面都是主动‘拉’的形式,如果需要更新页面内容,则需要刷新一个,但Slack工...

    Channe 评论0 收藏0
  • 初探 event loop

    摘要:事件循环了解知识点线程执行栈线程是单线程的语言可以单线程将理解为只有一条车道在车道里后面的车在等前面的车通过后才能通过即当前面的程序没有执行后面的程序也不能执行执行栈执行栈像车道被执行的程序会放入执行栈里但它的执行的顺序是后面进来的程序先执 事件循环 了解知识点 线程 执行栈 task queue web api macro task micro task 线程 javascrip...

    hsluoyz 评论0 收藏0
  • Vue.js 官方示例初探(ES6 改写)

    摘要:双叹号强制类型转换为布尔值。官方示例代码用注册了全局组件,会把自动注册为属性,所以没有手动写属性。如果对象是响应的,将触发视图更新。这是用来布尔值,又学了一招和分别代表单击和双击事件绑定。 如果觉得有帮助,欢迎 star哈~ https://github.com/jiangjiu/blog-md/issues/11 感谢作者 @尤小右 大大边写的超级带感的 Vue.js 前端框架,赠送...

    Jason 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<