Ajax请求基本封装

Ajax 封装

问题:发送一次请求代码过多,发送多次请求代码冗余且重复。
解决方案:将请求代码封装到函数中,发请求时调用函数即可。

  • 考虑三方面:1.请求方式 2.请求地址 3.请求结果的处理
ajax({ 
     type: 'get',//请求类型
     url: 'http://www.example.com',
     success: function (data) { //请求成功后处理 结果成功的函数
         console.log(data);
        //data代表请求结果
     }
 })

其中这三个对象 是在参考代码时候每个代码代码什么比较清晰

  • ajax发送基本步骤:创建对象
  • 配置对象(方式、地址)——通过ajax函数里面写这些实参——定义ajax的时候需要形参options对应 这个形参就存储着ajax里面内容——options.type可以得到请求方式——options.url得到地址
  • 发送请求调用send方法
  • 获取服务器端响应结果 ——监听xhr对象下面的onload事件——当xhr对象接收完响应数据后触发
    在这里插入图片描述
  //    4.调用ajax的时候传递了以下实参
		ajax({
			type: 'get',
			// 请求地址
			url: 'http://localhost:3000/first',
		})

ajax函数通用写法(处理结果不一样):再传递一个success函数

ajax({
			type: 'get',
			// 请求地址
			url: 'http://localhost:3000/first',
			success: function (data) {    //data函数传递过来
				console.log('这里是success函数');
				console.log(data)
			}
		})
//此函数在请求成功时被调用
xhr.onload = function () {
		options.success(xhr.responseText);//拿到属性值 调用函数  能过执行  还需把请求结果传递出去 data函数传递过来
	}

最终的基本封装:

function ajax (options) {
	var xhr = new XMLHttpRequest();
		xhr.open(options.type,option.url);
		xhr.send();//发送请求
	xhr.onload = function () {//获取服务器端给与客户端的响应结果
		options.success(xhr.responseText);//调用success 接收服务器响应结果
	}		
}

	ajax({
			type: 'get',
			// 请求地址
			url: 'http://localhost:3000/first',
			success: function (data) {    //请求成功被调用 即onload被触发  data传递服务器响应结果
				console.log('这里是success函数'+data);
			}
		})

能够向服务器端发送请求 也可以接收服务器端的响应

请求参数拼接问题

  • 请求参数要考虑的问题

     		1.请求参数位置的问题
    
     			将请求参数传递到ajax函数内部, 在函数内部根据请求方式的不同将请求参数放置在不同的位置
    
     			get 放在请求地址的后面
    
     			post 放在send方法中
    
  • 2.请求参数格式的问题

     			application/x-www-form-urlencoded
    
     			参数名称=参数值&参数名称=参数值   ——  name=zhangsan&age=20
    
     			application/json  —— {name: 'zhangsan', age: 20}
    
    
     			1.传递对象数据类型对于函数的调用者更加友好
     			2.在函数内部对象数据类型转换为字符串数据类型更加方便    考虑字符串转对象方便  还是对象转字符串方便
     			3.在data属性中传递第一种数据类型的话 可能需要转化成第二种数据类型
     			  传递第二种数据类型,有可能要转化成第一种数据类型    这种更加方便
    
  • ajax函数被调用 函数内部准备一个params变量 存储拼接好的字符串形式请求参数

  • for in循环循环 传递的对象 格式参数 循环体内部把请求参数拼接成想要的格式

  • 去掉&符 再把结果重新给params变量

  • 判断请求方式 get请求方式 拼接到地址栏 post 参数放到params 还要设置请求参数格式类型。get 调用send方法 不传递方式

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
	// 形参option选项配置的意思 对应传递来的实参  option=ajax函数里面参数
		function ajax (options) {
			// 存储的是默认值(没有传递参数的话)
			var defaults = {
				type: 'get',
				url: '',
				data: {},
				header: {
					//请求参数类型
					'Content-Type': 'application/x-www-form-urlencoded'
				},
				success: function () {},
				error: function () {}
			};

			// 使用options对象中的属性覆盖defaults对象中的属性 assign对象覆盖
			Object.assign(defaults, options);

			// 1.创建ajax对象
			var xhr = new XMLHttpRequest();
			// 拼接请求参数的变量
			var params = '';
			// 循环用户传递进来的对象data格式参数
			for (var attr in defaults.data) {
				// 将参数转换为字符串格式   属性名=属性值&属性值
				params += attr + '=' + defaults.data[attr] + '&';
			}
			// 将参数最后面的&截取掉   substr(开始位置,结束位置)
			// 将截取的结果重新赋值给params变量
			params = params.substr(0, params.length - 1);

			// 判断请求方式
			if (defaults.type == 'get') {
				defaults.url = defaults.url + '?' + params;
			}

			/*
				{
					name: 'zhangsan',
					age: 20
				}

				name=zhangsan&age=20

			 */

			// 3.配置ajax对象(配置的对象从最下面ajax找)
			xhr.open(defaults.type, defaults.url);
			// 如果请求方式为post
			if (defaults.type == 'post') {
				// 用户希望的向服务器端传递的请求参数的类型
				var contentType = defaults.header['Content-Type']
				// 设置请求参数格式的类型
				xhr.setRequestHeader('Content-Type', contentType);
				// 判断用户希望的请求参数格式的类型
				// 如果类型为json
				if (contentType == 'application/json') {
					// 向服务器端传递json数据格式的参数
					xhr.send(JSON.stringify(defaults.data))
				}else {
					// 向服务器端传递普通类型的请求参数
					xhr.send(params);
				}

			}else {
				// 发送请求
				xhr.send();
			}
			// 监听xhr对象下面的onload事件
			// 当xhr对象接收完响应数据后触发
			xhr.onload = function () {

				// xhr.getResponseHeader()
				// 获取响应头中的数据
				var contentType = xhr.getResponseHeader('Content-Type');
				// 服务器端返回的数据
				var responseText = xhr.responseText;

				// 如果响应类型中包含applicaition/json
				if (contentType.includes('application/json')) {
					// 将json字符串转换为json对象
					responseText = JSON.parse(responseText)
				}

				// 当http状态码等于200的时候
				if (xhr.status == 200) {
					// 请求成功 调用处理成功情况的函数   传递请求结果
					defaults.success(responseText, xhr);
				}else {
					// 请求失败 调用处理失败情况的函数
					defaults.error(responseText, xhr);//返回对象xhr
				}
			}
		}
    //    4.调用ajax的时候传递了以下实参
		ajax({
		   //请求方式
			type: 'post',
			// 请求地址
			url: 'http://localhost:3000/responseData',
			success: function (data) {
				console.log('这里是success函数');
				console.log(data)
			}
		})

	</script>
</body>
</html>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值