原生AJAX

it2023-11-08  74

AJAX

(一)Ajax运行原理:

Ajax相当于浏览器发送请求与接收响应的代理人,以实现在不影响用户浏览页面的情况下,局部更新页面数据,从而提高用户体验。

(二)Ajax运行步骤:

1)创建Ajax对象

var xhr = new XMLHttpRequest();

2)告诉Ajax请求地址以及请求方式

xhr.open('get','http://www.baidu.com');

3)发送请求

xhr.send();

4)获取服务器端与客户端的响应数据

xhr.onload = function(){ console.log(xhr.responseText); }

(三)Ajax请求参数方式:

1)GET请求方式

xhr.open('get', 'http://localhost:3000/get?name=zs&age=20');

2)POST请求方式

xhr.open('post', 'http://localhost:3000/post'); //设置请求参数格式的类型 xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); xhr.send('name=zs&age=20');

(四)Ajax请求参数的格式:

1)application/x-www-form-urlencoded(请求参数为拼接字符串)

name=zs&age=20&sex=

2)application/json(请求参数格式是json,get请求不能提交json对象数据格式,传统的表单提交也不支持json对象数据格式)

var json = { name:'zs', age:20, sex:'男' } JSON.stringify(json) //将json对象转换为json字符串

(五)获取服务端响应

Ajax状态码

在创建ajax对象,配置ajax对象,发送请求,以及接收完服务器端响应数据,这个过程中的每一个步骤都会对应一个数值,这个数值就是ajax状态码,ajax对象返回的。

xhr.readyState //获取Ajax状态码

0:请求未初始化(还没有调用open())

var xhr = new XMLHttpRequest();

1∶请求已经建立,但是还没有发送(还没有调用send())

xhr.open('get','http://localhost:3000/readystate');

2:请求已经发送 3∶请求正在处理中,通常响应中已经有部分数据可以用了 4:响应已经完成,可以获取并使用服务器的响应了

//当状态码发生变化时触发 xhr.onreadystatechange = function(){ }

(六)Http状态码

HTTP状态码表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常或者是出现的错误,能够根据返回的状态码判断请求是否得到正确的处理很重要(请求的处理结果,是服务端返回的)。
xhr.status //获取http状态码

1、状态码分类

2、常用状态码

1)200 OK:这个是最常见的http状态码,表示服务器已经成功接受请求,并将返回客户端所请求的最终结果。
2)403 Forbidden:服务器拒绝该次访问(访问权限出现问题)。
3)404 Not Found:请求失败,客户端请求的资源没有找到或者是不存在。
4)500 Inter Server Error:服务器遇到未知的错误,导致无法完成客户端当前的请求。
5)503 Server Unavailable:服务器由于临时的服务器过载或者是维护,无法解决当前的请求。

(七)Ajax封装

1)不传参数

//封装 function ajax(options){ var xhr = new XMLHttpRequest(); xhr.open(options.type,options.url); xhr.send(); xhr.onload = function() { options.success(xhr.responseText); } } //调用 ajax({ type:'get', url:'http://localhost:3000/first', success:function(data){ console.log(data) } })

2)传参数

function ajax(options) { //存储默认值 var defaults = { type: 'get', url: '', data: {}, header: { 'Content-Type': 'application/x-www-form-urlencoded' }, success: function () {}, error: function () {} } //使用options对象中的属性覆盖defaults对象中的属性 Object.assign(defaults, options); var xhr = new XMLHttpRequest(); var params = ''; //循环用户传递进来的对象格式参数 for (var attr in defaults.data) { //将参数转化为字符串格式 params += attr + '=' + defaults.data[attr] + '&' } //将参数最后的&截取掉 params = params.substr(0, params.length - 1) //判断请求方式 if (defaults.type == 'get') { defaults.url = defaults.url + '?' + params } xhr.open(defaults.type, defaults.url); //如果请求方式为post if (defaults.type == 'post') { //请求参数类型 var ContentType = defaults.header['Content-Type'] xhr.setRequestHeader('Content-Type', ContentType); if (ContentType == 'application/json') { //传递json数据格式 xhr.send(JSON.stringify(defaults.data)) } else { //传递字符串拼接格式 xhr.send(params) } } else { xhr.send(); } xhr.onload = function () { //获取响应头数据 var contenTtype = xhr.getResponseHeader('Content-Type') //服务器端返回的数据 var responseText = xhr.responseText //判断是否包含application/json if (contenTtype.includes('application/json')) { //将json字符串转化为json对象 responseText = JSON.parse(responseText) } //判断是否成功 if (xhr.status == 200) { defaults.success(responseText, xhr); } else { defaults.error(responseText, xhr) } } } ajax({ url: 'http://localhost:3000/first', data: { name: 'zs', age: 20 }, success: function (data, xhr) { console.log(data, xhr) }, })
最新回复(0)