在上篇笔记中,我们主要谈了一些概述和跨域的问题,这一次我们聊聊请求和响应的具体内容。

向服务器发起请求

我们在创建了XHR对象后,接着需要用两个方法来发送请求:open()和send(),这两个方法有点像赛跑前的两个步骤:预备、跑。在open()中,并没有实际发送请求,只是一个“预备”动作,真正的发送要到send()中了。

open和send

open()可以传递三个参数:

  1. method:请求的类型,GET或POST之类;
  2. url:文件在服务器的位置;
  3. async:同步或是异步,默认异步,当选择默认时,我们可以选择不填这个参数。

send()的参数只有一个,是运用在post方式的请求中,以string的形式。

以下是一个例子:

xhr.open("GET","example.PHP",true);
xhr.send();
//post不需要传递参数;
xhr.open("POST",true);
xhr.send();
//post需要传递参数;
xhr.open("POST",true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlcoded");
xhr.send("fname=henry&lname=ford")

get和post

get常用于查询数据,有时候,需要我们用某种指定的格式把参数追加到url的末尾。如果格式不正确的话,会出现错误。

举一个例子:

xhr.open("get","example.PHP?name1=value1&name2=value2",true");
xhr.send();

post多用于向服务器提交应该被保存的数据。与get不同的是,post应该以发送的数据作为请求的主体。参数则不需要写在url里了,而是写在send里,在这里,可以传递XML DOM文档也可以传递字符串。当然,要注意的是,如果只是简单的,没有数据传递的POST请求,那么和GET请求一样,在send()中不需要添加什么。如果需要POST数据,我么要用setRequestHeader()来添加HTTP头,然后在send()中用参数的形式添加数据传递。

HTTP头部信息

每个HTTP请求都带有头信息,所以我们发送一个AJAX请求时,实际上也会发送相关的头信息。默认情况下,下列的头信息会被发送出去:

  • Accept;
  • Accept-Charset;
  • Accept-Ending;
  • Accept-Language;
  • Connection;
  • Cookie;
  • Host;
  • Refer;
  • User-Agent;

使用setRequestHeader()可以设置自定义的头信息。这个方法接收两个参数:头部字段的名称和值。例如:

xhr.setRequestHeader("Content-type","application/x-www-form-urlcoded");

xhr.setRequestHeader("MyHeader","MyValue");

要注意的是setRequestHeader方法需要在open()和send()中间设置,这样才能成功发送请求的头部信息。

服务器响应

当我们发送请求后,一切顺利,服务器也顺利发回了响应,那么我们要怎么来获取这些响应呢?

responseText和responseXML

这是获取两种不同格式的响应,esponseText是字符串形式,responseXML则是XML形式。

举一个例子:

var xhr;
if(window.XMLHttpRequest){
  xhr=new XMLHttpRequest();
}else{
  xhr=new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.onreadystatechange=function(){
  if(xhr.readyState==4 && xhr.status==200){
    document.getElementById("myDiv").innerHTML=xhr.responseText;
  }
}
xhr.open("get",true);
xhr.send();

就是这样。

XHR 2级

XHR的发展也促使W3C着手制定更为完善的2级规范。在这套规范里,有一些内容需要了解。

FormData

为了实现表单数据的序列化,在Web应用中更方便地传输数据,2级规范定义了FormData类型。

下面是一个创建FormData实例的例子:

<form id="myForm" action="" method="post">
    <input type="text" name="name">名字
    <input type="password" name="psw">密码
    <input type="submit" value="提交">
</form>
var data=new FormData();
//直接添加键值对
data.append("nama","Mike");
//通过向构造函数中传入表单元素也可
  //这是一个表单元素
var form=document.getElementById("myForm");
  //传入
var data=new FormData(form);
xhr.send(data);
  //获取
var name=data.get("name");
var psw=data.get("psw");

创建了FormData的实例后,可以直接传到send中。

关于更详细的FormData知识,请参考这篇文章:
系统学习前端之FormData详解 - 前端与生活 - SegmentFault

超时设置

最早是IE8为XHR添加了timeout属性,后来被XHR 2级规范收入。

当给timeout设置了数值后,规定时间内没有响应,就会触发timoeout事件,进而调用ontimeout。

这是一个例子:

var xhr;
...
xhr.open("get",true);
xhr.timeout=1000;
xhr.ontimeout=function(){
  alert("Request is not return in a second"
};
xhr.send();

进度事件

XHR 2的进度事件定义了XHR在请求的不同阶段触发不同的事件,具体的有6个事件:

  • loadstart;
  • progress;
  • error;
  • abort;
  • load;
  • loadend;

每个浏览器所支持的事件不完全相同,比如IE8就支持load事件。有了这些不同的事件支持,开发者可以免去检查readyState之类的工作,更加的方便。

其中load事件和progress事件比较重要。load事件会在接收到完整的响应数据时触发,因此我们就不需要再检查readyState属性了,只要确保XHR的status为200就可以了。

progress事件则会为XHR在浏览器接收数据期间周期性地触发。在触发时,它会额外地提供三个属性:

  1. lengthComputable;表示进度信息是否可用
  2. position;表示已经接收的字节数
  3. totalSize;表示响应头确定的预期字节数

有了这些信息,我们可以创造一个进度指示器:

var xhr=createXHR();
xhr.onload=function(event){
...
}
xhr.onprogress=function(event){
  var divstatus=document.getElementById("status");
if(event.lengthcoputable){
  divstatus.innerHTML="Reiceived"+event.position+"of"+event.totalSize+"bytes";
}
};

这里要注意的是:必须在调用open()方法之前添加progress事件处理程序。

AJAX的学习笔记二的更多相关文章

  1. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  2. ios – 错误域= NSURLErrorDomain代码= -1003“找不到具有指定主机名的服务器

    当我尝试在设备上运行应用程序时出现此错误.当我在模拟器上运行它并且post请求正常工作时,我没有收到此错误.这是我的代码片段:任何帮助表示赞赏.谢谢解决方法此错误通常会提示DNS相关问题.检查设备上的DNS设置并确认您可以使用Safari或其他浏览器浏览互联网.如果有一个url,你可以在同一台服务器上获取,尝试直接在设备上的Safari中访问它.

  3. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  4. ios – 使用CocoaPods post install hook将自定义路径添加到HEADER_SEARCH_PATHS

    解决方法在Podfile中定义一个方法:然后在post_install中调用该方法:

  5. iOS7 Safari中的全屏模式

    我正在使用SenchaTouch开发移动网站.在iOS7Safari中,我无法创建顶级地址栏和下面的工具栏消失了.Sencha过去常常处理iOS6,但iOS7最近的一些变化导致了这个问题.http://java.dzone.com/articles/safari-ios-7-and-html5我阅读了上面的链接&对于HTML5游戏而言,这似乎也是一个问题.一些其他应用程序.适用于iOS6的旧win

  6. ios – 如何使用新的Apple Swift语言发布JSON

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  7. ios – POST请求使用application / x-www-form-urlencoded

    后端开发人员在POST请求中给出了这些说明:>路线:{url}/{app_name/{controller}/{action}控制器和动作应该是小帽子.>API测试链接:http:****************>请求应该使用POST方法.>参数应通过请求内容体(FormUrlEncodedContent)传递.>参数应该是json格式.>参数是关键的.在协议中没有经验5,我搜索并结束了我的代码.

  8. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  9. ios – 在HTTPBody中设置NSDictionary并使用POST方法发送

    我想用POST方法调用Web服务.我需要发布一个带有URL的字典.我的Web服务参数如下:以下是我的要求:但是我收到以下错误:服务器拒绝此请求,因为请求实体的格式不受所请求方法所请求资源的支持解决方法请找到以下代码,将数据发布到Web服务.请注意这是我在我的一个申请中使用的样本.希望这可以帮助.从您的评论“服务器拒绝此请求”服务器是否支持JSON或XML格式.

  10. ios – 如何使用Firebase存储喜欢的内容

    我有一个关于firebase的后端,有像Facebook这样的帖子.所以我需要喜欢这些帖子的功能.问题是如何存储喜欢帖子的喜欢和用户?

随机推荐

  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找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部