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>