Ajax中XMLHttpRequest对象的详细解析(1)

if(xhr.status>=200&&xhr.status<300){

const blob=this.response

//…

}

}

xhr.send(null)

6.withCredentials属性
  • withCredentials属性是一个布尔值,表示跨域请求是否携带凭据信息(cookie、HTTP认证、以及客户端SSL证明等),默认为false

  • 如果需要跨域Ajax请求发送Cookie,需要withCredentials属性设置为true

  • 如果在同域下配置xhr.withCredentials,无论配置true还是fasle,效果都是一样的

//配置跨域

const xhr = new XMLHttpRequest();

xhr.open(‘get’,‘/server’,true);

xhr.withCredentials=true;

xhr.send(null)

  • 当配置了withCredentials为true时,必须在后端增加response头信息Access-Control-Allow-Origin,且必须指定域名,而不能指定为*。

  • 还需要添加Access-Control-Allow-Origin这个头信息为true;

//后端配置跨域

response.addHeader(“Access-Control-Allow-Origin”, “http://example.com”);

response.addHeader(“Access-Control-Allow-Origin”, true)

7.response属性
  • response属性表示服务器返回的数据,它可以时任何数据类型,比如字符串、对象、二进制对象等待,具体的类型由XMLHttpRequest.responseType属性决定

  • 如果本次请求没有成功或者数据不完整,该属性等于null

const xhr = new XMLHttpRequest()

xhr.onreadystatechange = function () {

if (xhr.readyState === 4) {

console.log(xhr.response)

}

}

8.responseText属性
  • responseText属性返回从服务器接收到的字符串,该属性为只读

  • 当readyState值为0、1、2时,responseText包含一个空字符串。当readyState值为3时(正在接收),响应中包含客户端还没完成的响应信息;当readyState为4时,此时响应已经完全接收,那么responseText包含完整的响应信息

if (xhr.readyState === 4) {

if (xhr.status >= 200 && xhr.status < 300) {

// 处理服务器的返回数据

console.log(xhr.responseText)

}

}

9.responseXML属性
  • 如果相应的内容类型时”text/xml“或者”appliction/xml“,这个属性中将保存着包含响应数据的HTML或者XML文档对象;该属性为只读类型

  • 无论内容类型是什么,响应主体的内容都会保存到responseText属性,而对于非XML数据而言,responseXML属性的值将为null

10.responseURL属性

responseURL属性时字符串,表示发送数据的服务器的地址,如果URL为空,则返回空字符串。如果URL有锚点,则位于URL#后面的内容会被删除。如果服务器端发生跳转,这个属性返回最后实际返回数据 的地址

const xhr=new XMLHttpReauest();

xhr.open(‘GET’,‘http://example.com/test’,true);

xhr.οnlοad=function(){

//返回http://example.com/test

console.log(xhr.responseURL)

}

xhr.send(null)

11.status属性(HTTP状态码)
  • 这个属性描述了HTTP状态码,属性返回一个整数。同时,当且仅当readyState值为3时(正在接收)和readyState=4时,这个属性才可以使用后。

  • 若在reagyState值小于3时试图取status的值,将会引发一个异常

  • status的值有:200表示成功,404表示为找到资源

if (xhr.readyState === 4) {

if (xhr.status >= 200 && xhr.status < 300) {

// 处理服务器的返回数据

}

}

12.statusText属性
  • statusText属性返回一个字符串,表示服务器发送的状态数目。比如ok和 Not Found。在请求发送之前,该属性的值是一个空字符串,如果服务器没有返回状态提示,该属性默认为欸OK。该属性为只读属性

  • 注意:要通过检测status属性来决定下一步的操作,不要依赖statusText,因为statusText在跨浏览器使用时不太可靠

1.4XMLHTTPRequest对象的方法详细说明
1.4.1.XMLHTTPRequest对象的方法

| 方法 | 描述 |

| — | — |

| abort() | 停止当前请求 |

| getAllResponseHeaders() | 把HTTP请求的所有响应首部作为键/值对返回 |

| getResponseHeader(“header”) | 返回指定首部的串值 |

| open(“method”,“url”,async) | 建立与服务器的连接,methos参数可以是GET、POST或者PUT等;url参数时相对的url或者绝对url。 |

| send(content) | 向服务器发送请求 |

| setRequestHeader(“header”,“value”) | 把指定的首部设置提供的值,注意:在设置任何首部之前必须在调用open()方法和send()方法之后设置 |

1.4.2.XMLHttpRequest对象方法的详细使用
1.open()方法-----用于初始化一个请求

open()方法接收三个参数:

  • 第一个参数methos:要发送请求的类型。比如GET、POSE、PYT等。

  • 第二个参数url:请求的URL

  • 第三个参数async:是否异步发送请求的布尔值。true为异步发送请求。

const xhr=new XMLHttpRequest();

xhr.open(‘get’,‘/userInfo’,true)

  • 调用open()

方法并不会真正的发送请求,而是启动一个琼琼以备发送;

2.send()方法-----用于发送HTTP请求

send()方法接收一个参数:

  • 参数data:作为请求主体发送的数据,如果不需要通过请求主体数据(即不传实际的data时),也必须传入null。

  • 参数data可以接收字符串、FromData(From表单)、Blob、ArrayBuffer等类型数据

const xhr=new XMLHTTPRequest();

xhr.send(null);

3. setRequestHeader()方法
  • setRequestHeader()方法可以设置自定义的请求头部信息

  • 接收两个参数:

第一个参数header:头部字段的名称

第二个参数value:头部字段的值

  • 要成功发送请求头部信息。,此方法必须在open()和send()之间调用

const xhr=new XMLHttpRequest();

xhr.open(‘get’,‘/server’,true);

xhr.setRequestHeader(‘MyHeader’,‘MyValue’);

xhr.send(null)

4.abort()方法和onabort事件
  • 在接收响应之前调用abort()方法来取下异步请求。当一个请求被终止后,那么它的readyState属性将被置为0.在终止请求之后,还应该对XMLHttpRequest对象进行解引操作。

  • 当调用abort()之后,会触发onabort事件

//abort()方法

const xhr=new XMLHttpRequest();

xhr.open(‘get’, ‘/server’, true);

xhr.οnabοrt=function(){

console.log(‘请求被终止’);

}

xhr.send(null);

//将会调用我们在上面定义的onabort回调函数

xhr.abort()

1.5 XMLHttpRequest进度事件相关的API
1 onload
  • 当请求成功,接收到完整的现溢数据时触发

  • 可以使用onload事件来替代readtstatechange事件,因为响应接收完毕后将触发onload事件,因此就没有必要检查readyState属性了。只要浏览器接收到服务器的响应,不管其状态如何,都会触发load事件

//使用onload事件来监听服务器的响应

const xhr = new XMLHttpRequest();

//当服务器响应完成时便会触发load事件

xhr.onload = function onload() {

console.log(‘请求数据接收完毕’)

if (xhr.status >= 200 && xhr.status < 300) {

console.log(xhr.responseText)

}

}

xhr.open(‘get’, ‘/server’, true);

xhr.send(null);

2.onerror

设置当请求失败时的监听函数

xhr.οnerrοr=function(){

//

console.log(‘请求失败’);

}

1.6 请求方式
1.6.1 GET请求
  • 将查询字符串参数追加到URL的末尾,将信息发送给服务器

  • GET参数的编码方式使无法认为干涉的,这导致了不同浏览器有不同的编码方式,因此最稳妥的使人工预编码,人工编码,人工解码,从而禁止浏览器的编码干涉

//GET请求的人工预编码

const xhr=new XMLHttpRequest();

//使用encodeURIComponent()进行编码

xhr.open(‘get’, ‘/server’, true);

const temParam=encodeURIComponent(‘age’);

const temValue=encodeURIComponent(‘20’);

xhr.open(‘get’,‘/server?temParam=tempValue&money=100’,true)

1.6.2 POST请求
  • POST请求把数据作为请求的主体(请求的body)提交,下面四种常见的PSET请求提交数据方式

1)application/json

当发送Ajax请求时,把appliction/json作为请求头,用来告诉服务器消息主体是序列化后的JSON字符串

2)text/xml

使用HTTP作为传输协议,XML作为哦编码方式的远程调用规范

3)application/x-www-form-urlencoded

浏览器原生form表单,如果不设置enctype属性,那么最终就会以application/x-www-form-urlencoded方式提交数据

4)multipart/form-data

表单上传文件时,必须让form表单的enctype等于multipart/form-data

  • 举例如下

使用XMLHttpRequest模拟表单提交

将Content-Type头部信息设置为application/x-www-form-urlencoded。可以使用XMLHttpRequest对象来模仿表单提交。

const xhr = new XMLHttpRequest()

xhr.open(‘post’, ‘/server’, true)

xhr.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’)

const form = document.getElementById(‘myForm’)

// serialize()为表单序列化方法

xhr.send(serialize(form))

也可以使用XMLHttpRequest level 2的FormData来序列化表单数据。

const xhr = new XMLHttpRequest()

xhr.open(‘post’, ‘/server’, true)

const form = document.getElementById(‘myForm’)

const formData = new FormData(form)

formData.append(“id”, “123456”)

xhr.send(formData)

2.使用Ajax实现异步请求

2.1一般实现

//一般实现

const xhr = new XMLHttpRequest();

xhr.open(‘get’, ‘/server’, true);

//设置响应类型

xhr.responseType = ‘json’

//设置请求头信息

xhr.setRequestHeader(‘MyHeader’, ‘MyValue’);

//设置请求失败监听函数

xhr.onload = function () {

console.log(‘请求失败了…’)

}

//为XMLHttpRequest对象的状态设置监听事件(监听onreadystatechange)

xhr.onreadystatechange = function () {

if (this.readyState !== 4) {

return;

}

if (this.status >= 200 && this.status < 300) {

//响应正常

console.log(this.responseText)

} else {

console.log(this.statusText)

}

}

//发送请求

xhr.send(null);

2.2 Promise封装实现

//Promise封装实现

function getJSON(url) {

let promise = new Promise((resolve, reject){

const xhr = new XMLHttpRequest();

xhr.open(‘get’, ‘/server’, true);

//设置响应类型

xhr.responseType = ‘json’

//设置请求头信息

xhr.setRequestHeader(‘MyHeader’, ‘MyValue’);

//为XMLHttpRequest对象的状态设置监听事件(监听onreadystatechange)

xhr.onreadystatechange = function () {

if (this.readyState !== 4) {

return;

}

if (this.status >= 200 && this.status < 300) {

//响应正常

// console.log(xhr.responseText)

resolve(this.responseText)

} else {

reject(new Error(this.statusText))

}

}

})

return promise;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
ect(new Error(this.statusText))

}

}

})

return promise;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-jx0ELUnP-1714819479209)]

[外链图片转存中…(img-Kcf7r3My-1714819479209)]

[外链图片转存中…(img-SN8h8HY5-1714819479209)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值