在看了一些文章之后,对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',headers: new Headers({
                'Accept': 'application/json'
            })
        })
        .then((res)=>{
            return res.json()
        })
        .then((res)=>{
            console.log(res);
        })

ajax初探的更多相关文章

  1. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  2. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  3. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  4. iOS网页/原生应用Facebook登录弹出 – 失败?

    如果我重新启动app/web-app,用户将自动登录,并重定向到成功页面.我认为是导致问题的原因当您在Firefox/Chrome/Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡.我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信.window.close的东西没有返回的根页面…失败的解决方法由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebvie

  5. ios – Watchkit新会话不起作用

    我的手表扩展中有两个视图控制器.每当我打电话时我只得到第一个视图控制器的响应,并在第二个viewcontroller中得到错误WCSession在app和watch扩展中启动.任何建议?

  6. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

  7. ios – 保存从查询中获取的用户的属性(即不在currentUser上)

    我有兴趣根据currentUser执行的操作将属性保存到数据库中的用户.基于以下代码,我收到错误消息“除非已通过logIn或signUp验证用户,否则无法保存用户”我想知道是否有一个解决方法,我可以将属性保存到foundUser,而无需登录该用户.谢谢你的帮助!解决方法如果要更新当前不是登录用户的用户,则需要使用主密钥调用Parse.您可以从CloudCode执行此操作;并从您的iOS项目中调用它;

  8. 在iOS中使用NSJSONSerialization进行JSON解析

    解决方法首先在您的JSON响应字典中,在“RESPONSE”键下,您有一个数组而不是字典,该数组包含字典对象.所以要提取用户名和电子邮件ID,如下所示

  9. Xcode:Alamofire获得String响应

    我是IOS开发的新手,目前正在与Alamofire学习网络我正在尝试登录…每当凭证正确时,.PHP文件返回一个json,我可以通过以下代码从Alamofire获取json:现在……当凭证错误时,.PHP不会给json..而且它返回一个字符串..例如“wrong_password”或“userLocked”等等……如何通过Alamofire获得String响应?解决方法如果您希望JSON响应使用.responseJSON,如果您想要String响应,请使用.responseString.如果你想两者同时使用

  10. ios – 全局变量中的Appdelegate in swift

    我将一些数据从viewcontroller&从另一个视图控制器获取它.下面是应用程序委托的代码代码设置mainDic代码来获取字典.问题是我得到的输出没有.请让我正确.解决方法这是你的错误尝试将您的代码更改为此

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部