前端技术Ajax入门
1.1 AJAX 概念和 axios 使用
目标
- 了解 AJAX 概念并掌握 axios 库基本使用
讲解
1. 什么是 AJAX?
- 使用浏览器的
XMLHttpRequest
对象与服务器通信。 - 在浏览器网页中,通过 AJAX 技术(XHR 对象)发起获取省份列表数据的请求,服务器返回准备好的省份列表数据给前端,前端将数据展示到网页。
2. 什么是服务器?
- 可以暂时理解为提供数据的一台电脑。
3. 为何学习 AJAX?
- 以前数据是固定的,无法随时变化。
- 现在可以从服务器获取数据,让数据动态化。
4. 如何学习 AJAX?
- 使用第三方库
axios
,后续再学习XMLHttpRequest
对象以了解 AJAX 底层原理。 axios
语法简单,让我们更关注与服务器通信,且在 Vue、React 中也使用axios
。
5. 需求:从服务器获取省份列表数据并展示到页面
- 目标资源地址:
http://hmajax.itheima.net/api/province
6. 讲解 axios 语法步骤
7. 引入 axios.js 文件
html
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> |
8. axios 函数语法
javascript
axios({ | |
url: '目标资源地址' | |
}).then((result) => { | |
// 处理服务器返回的数据 | |
}); |
9. 示例代码
html
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<title>AJAX概念和axios使用</title> | |
</head> | |
<body> | |
<p class="my-p"></p> | |
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> | |
<script> | |
axios({ | |
url: 'http://hmajax.itheima.net/api/province' | |
}).then(result => { | |
console.log(result.data.list); | |
document.querySelector('.my-p').innerHTML = result.data.list.join('<br>'); | |
}); | |
</script> | |
</body> | |
</html> |
小结
- AJAX 的作用:浏览器和服务器之间通信,实现动态数据交互。
- 学习方法:先掌握
axios
库,再了解XMLHttpRequest
原理。 - axios 体验步骤:引入库文件,使用
axios
语法。
1.2 认识 URL
目标
- 了解 URL 的组成和作用
讲解
1. 为什么要认识 URL?
- 了解 URL 的结构,方便与服务器有效沟通。
2. 什么是 URL?
- 统一资源定位符,简称网址,用于定位网络中的资源(如网页、图片、数据等)。
3. URL 的组成
- 协议:如
http
,规定浏览器和服务器传递数据的格式。 - 域名:标记服务器在互联网中的位置。
- 资源路径:标识服务器内的具体资源。
4. 示例需求
- 访问新闻列表的 URL:
http://hmajax.itheima.net/api/news
5. 示例代码
javascript
axios({ | |
url: 'http://hmajax.itheima.net/api/news' | |
}).then(result => { | |
console.log(result); | |
}); |
小结
- URL 是什么:统一资源定位符,用于访问服务器上的资源。
- URL 组成:协议、域名、资源路径。
1.3 URL 查询参数
目标
- 掌握通过 URL 传递查询参数,获取匹配的数据
讲解
1. 什么是查询参数?
- 携带给服务器的额外信息,用于获取特定数据。
2. 查询参数语法
http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2 |
3. axios 携带查询参数
javascript
axios({ | |
url: '目标资源地址', | |
params: { | |
参数名: 值 | |
} | |
}).then(result => { | |
// 处理服务器返回的数据 | |
}); |
4. 示例需求
- 获取“河北省”下属的城市列表:
- URL:
http://hmajax.itheima.net/api/city
- 参数名:
pname
- URL:
5. 示例代码
javascript
axios({ | |
url: 'http://hmajax.itheima.net/api/city', | |
params: { | |
pname: '辽宁省' | |
} | |
}).then(result => { | |
console.log(result.data.list); | |
document.querySelector('p').innerHTML = result.data.list.join('<br>'); | |
}); |
小结
- 查询参数作用:提供额外信息,获取对应数据。
- axios 使用方法:通过
params
选项携带参数。
1.4 案例:查询地区列表
目标
- 巩固查询参数的使用,查看多对查询参数如何传递
讲解
1. 需求
- 根据输入的省份和城市名字,查询下属地区列表。
- URL:
http://hmajax.itheima.net/api/area
- 参数名:
pname
:省份名字cname
:城市名字
2. 示例代码
javascript
document.querySelector('.sel-btn').addEventListener('click', () => { | |
let pname = document.querySelector('.province').value; | |
let cname = document.querySelector('.city').value; | |
axios({ | |
url: 'http://hmajax.itheima.net/api/area', | |
params: { | |
pname, | |
cname | |
} | |
}).then(result => { | |
let list = result.data.list; | |
let theLi = list.map(areaName => `<li>${areaName}</li>`).join(''); | |
document.querySelector('.list-group').innerHTML = theLi; | |
}); | |
}); |
小结
- ES6 对象简写:属性名和值同名时可简写。
1.5 常用请求方法和数据提交
目标
- 掌握如何向服务器提交数据
讲解
1. 请求方法
- 常用方法:
GET
、POST
、PUT
、DELETE
、PATCH
。 GET
:获取数据(默认)。POST
:提交数据。
2. 何时提交数据?
- 如订单数据、登录信息等需要保存到服务器。
3. axios 提交数据
javascript
axios({ | |
url: '目标资源地址', | |
method: 'POST', | |
data: { | |
参数名: 值 | |
} | |
}).then(result => { | |
// 处理服务器返回的数据 | |
}); |
4. 示例需求
- 注册账号,提交用户名和密码:
- URL:
http://hmajax.itheima.net/api/register
- 请求方法:
POST
- 参数名:
username
:用户名password
:密码
- URL:
5. 示例代码
javascript
document.querySelector('.btn').addEventListener('click', () => { | |
axios({ | |
url: 'http://hmajax.itheima.net/api/register', | |
method: 'POST', | |
data: { | |
username: 'itheima007', | |
password: '7654321' | |
} | |
}); | |
}); |
小结
- 常用请求方法:
POST
(提交数据)、GET
(查询数据)。 - axios 核心配置项:
url
、method
、params
、data
。
1.6 axios 错误处理
目标
- 掌握接收 axios 响应错误信息的处理语法
讲解
1. 错误处理
- 使用
catch
方法捕获请求响应错误:
javascript
axios({ | |
// ...请求选项 | |
}).then(result => { | |
// 处理成功数据 | |
}).catch(error => { | |
// 处理失败错误 | |
}); |
2. 示例代码
javascript
document.querySelector('.btn').addEventListener('click', () => { | |
axios({ | |
url: 'http://hmajax.itheima.net/api/register', | |
method: 'post', | |
data: { | |
username: 'itheima007', | |
password: '7654321' | |
} | |
}).then(result => { | |
console.log(result); | |
}).catch(error => { | |
console.log(error.response.data.message); | |
alert(error.response.data.message); | |
}); | |
}); |
小结
- 错误处理:通过
.catch
方法捕获错误信息。
1.7 HTTP 协议-请求报文
目标
- 了解 HTTP 协议中请求报文的组成和作用
讲解
1. 请求报文组成
- 请求行:请求方法、URL、协议。
- 请求头:附加信息(如
Content-Type
)。 - 空行:分割请求头和请求体。
- 请求体:发送的资源。
小结
- 请求报文组成:请求行、请求头、空行、请求体。
1.8 请求报文-错误排查
目标
- 了解查看请求报文的作用,辅助错误排查
讲解
- 通过查看请求报文确认发送的数据是否正确。
小结
- 作用:快速确认发送内容是否正确。
1.9 HTTP 协议-响应报文
目标
- 了解响应报文的组成
讲解
1. 响应报文组成
- 响应行:协议、状态码、状态信息。
- 响应头:附加信息(如
Content-Type
)。 - 空行:分割响应头和响应体。
- 响应体:返回的资源。
2. HTTP 响应状态码
- 如
404
表示资源不存在。
小结
- 响应报文组成:响应行、响应头、空行、响应体。
- 状态码作用:表明请求是否成功完成。
1.10 接口文档
目标
- 掌握接口文档的使用,配合 axios 与服务器进行数据交互
讲解
1. 接口文档
- 描述接口的文章(由后端提供)。
- 包含请求的 URL、方法、参数等信息。
2. 示例需求
- 查看登录接口文档,编写登录代码。
3. 示例代码
javascript
document.querySelector('.btn').addEventListener('click', () => { | |
axios({ | |
url: 'http://hmajax.itheima.net/api/login', | |
method: 'post', | |
data: { | |
username: 'itheima007', | |
password: '7654321' | |
} | |
}); | |
}); |
小结
- 接口文档:描述接口的文章。
- 包含内容:URL、请求方法、参数。
1.11 案例:用户登录-主要业务
目标
- 尝试通过页面获取用户名和密码,进行登录
讲解
1. 实现步骤
- 点击登录,获取并判断用户名和密码长度。
- 提交数据与服务器通信。
2. 示例代码
javascript
document.querySelector('.btn-login').addEventListener('click', () => { | |
const username = document.querySelector('.username').value; | |
const password = document.querySelector('.password').value; | |
if (username.length < 8) { | |
console.log('用户名必须大于等于8位'); | |
return; | |
} | |
if (password.length < 6) { | |
console.log('密码必须大于等于6位'); | |
return; | |
} | |
axios({ | |
url: 'http://hmajax.itheima.net/api/login', | |
method: 'POST', | |
data: { | |
username, | |
password | |
} | |
}).then(result => { | |
console.log(result.data.message); | |
}).catch(error => { | |
console.log(error.response.data.message); | |
}); | |
}); |
小结
- 实现思路:绑定点击事件、获取输入值、判断长度、提交数据。
1.12 案例:用户登录-提示信息
目标
- 根据提示标签和样式,给用户反馈提示
讲解
1. 封装提示框函数
javascript
function alertFn(msg, isSuccess) { | |
myAlert.classList.add('show'); | |
myAlert.innerText = msg; | |
const bgStyle = isSuccess ? 'alert-success' : 'alert-danger'; | |
myAlert.classList.add(bgStyle); | |
setTimeout(() => { | |
myAlert.classList.remove('show'); | |
myAlert.classList.remove(bgStyle); | |
}, 2000); | |
} |
小结
- 封装函数:遇到重复逻辑时封装为函数。
- 提示框控制:通过添加或移除类名控制显示/隐藏。
1.13 form-serialize 插件
目标
- 使用 form-serialize 插件快速收集表单元素的值
讲解
1. 插件使用
- 引入插件文件。
- 使用
serialize
函数:
javascript
const form = document.querySelector('.example-form'); | |
const data = serialize(form, { hash: true, empty: true }); | |
console.log(data); |
小结
- 使用场景:快速收集表单元素的值。
- 配置选项:
hash
(对象/查询字符串)、empty
(是否收集空值)。
1.14 案例:用户登录-form-serialize
目标
- 使用 form-serialize 插件重新修改用户登录案例
讲解
1. 修改代码
javascript
// 引入插件 | |
<script src="./lib/form-serialize.js"></script> | |
// 使用 serialize 函数 | |
const form = document.querySelector('.login-form'); | |
const data = serialize(form, { hash: true, empty: true }); | |
const { username, password } = data; |