【前端】-【axios】-学习笔记
1. HTTP 相关 (准备共作)
1.1 HTTP请求交互的基本过程
1.前后应用从浏览器端向服务器发送 HTTP 请求(请求报文)
2.后台服务器接收到请求后,调度服务器应用处理请求,向浏览器端返回HTTP响应(响应报文)
3.浏览器端接收到响应,解析显示响应体/调用监视回调
1.2 请求报文
HTTP 请求报文由请求行、请求头、空行和请求包体(body)组成。
- 请求行
methodurl:GET/product_detail?id=2POST/login- 多个请求头
Host:www.baidu.com
Cookie:BAIDUID=AD3B0FA706E;BIDUPSID=AD3B0FA706;
Content-Type:application/x-www-form-urlencoded
或者application/json- 请求体
username=tom&pwd=123
{“username”:“tom”,“pwd”:123}
1.3 响应报文
HTTP 响应报文由状态行、响应头部、空行和响应包体(body)组成
1.4 常见的响应状态码
200
OK 请求成功。一般用于GET与POST请求201
Created 已创建。成功请求并创建了新的资源401
Unauthorized 未授权/请求要求用户的身份认证404
NotFound 服务器无法根据客户端的请求找到资源500
InternalServerError 服务器内部错误,无法完成请求
1.5 请求方式与请求参数
1.请求方式
2.请求参数
1. query参数(查询字符串参数)
- 参数包含在请求地址中,格式是:
/xxxx?name=tom&age=18
- 敏感数据不要使用query参数,因为参数是地址的一部分,比较危险
- 备注:query参数又称查询字符串参数,编码方式为
urlencoded
2. params参数
- 参数包含在请求地址中,格式是:
http://localhost:3000/add_person/tom/18
- 敏感数据不要使用query参数,因为参数是地址的一部分,比较危险
3. 请求体参数
- 参数包含在请求体中,可以通过浏览器开发工具查看
- 常用两种格式:
格式一:urlencoded
格式
例如:name=tom&age=18
对应请求头:Content-Type:application/x-www-form-urlencoded
格式二:json格式
例如{“name”:“Tom”,“age”:18}
对应请求头:Content-Type:application/json
特别注意
2. API 相关
2.1 API分类
2.2 使用json-server 搭建REST API
2.2.1 json-server 是什么?
用来快速搭建REST API 的工具包
10秒快速建一个服务器
2.2.2 使用json-server
在线文档: https://github.com/typicode/json-server
- 下载安装(全局):
npm install -g json-server
- 目标根目录下创建数据库 json 文件:
db.json
- 启动服务器执行命令:
json-server --watch db.json
#db.json 文件
{
"posts": [
{ "id": 1, "title": "json-server", "author": "typicode" },
{ "id": 2, "title": "json-server2", "author": "typicode" }
],
"comments": [
{ "id": 1, "body": "some comment", "postId": 1 }
],
"profile": { "name": "typicode" }
}
2.2.3 使用浏览器访问测试
http://localhost:3000/posts
http://localhost:3000/posts/1
2.2.4 使用 postman 测试接口
测试 GET/POST/PUT/DELETE
json-server 模拟的服务器,id必须用params带,其他的可以用请求体:
http://localhost:3000/students/3
GET query参数
get Params参数
请求体 urlencoded形式
请求体 json形式
2.2.5 一般http请求与 ajax请求
-
ajax
(xhr)请求是一种特别的http
请求 - 对服务器端来说,没有任何区别,区别在浏览器端
- 浏览器端发请求:只有
XHR
或fetch
发出的才是ajax
请求,其它所有的都是非ajax请求 - 浏览器端接收到响应
(1)一般请求:浏览器一般会直接显示响应体数据,也就是我们常说的刷新/跳转页面
(2)ajax请求:浏览器不会对界面进行任何更新操作,只是调用监视的回调函数并传入响应相关数据
3 axios的理解和使用
3.1 axios是什么?
- 前端最流行的ajax请求库
- react/vue官方都推荐使用axios发ajax请求
- 文档:https://github.com/axios/axios
3.2 axios特点
3.2 axios 基本使用
引入
axios(config): 通用/最本质的发任意类型请求的方式axios(url[,config]):
可以只指定url 发get 请求axios.request(config):
等同于axios(config)axios.get(url[,config]):
发get 请求axios.delete(url[,config]):
发delete 请求axios.post(url[,data,config])
: 发post 请求axios.put(url[,config]):
发put 请求
axios.defaults.xxx:
请求的默认全局配置(method\baseURL\params\timeout…)axios.interceptors.request.use():
添加请求拦截器axios.interceptors.response.use():
添加响应拦截器
axios.create([config]):
创建一个新的axios(它没有下面的功能)
axios.Cancel():
用于创建取消请求的错误对象axios.CancelToken():
用于创建取消请求的 token 对象
axios.isCancel(): 是否是一个取消请求的错误axios.all(promises)
: 用于批量执行多个异步请求
axios.spread(): 用来指定接收所有成功数据的回调函数的方法
————————————————
<script type = "text/javascript" src="./js/axios.min.js"></script>
<button id="btn1"> 点我获取所有人</button>
<button id="btn1"> 点我获取某个人</button>
<input id="person_id" type="test" placeholder="请输入一个人的id"> </input>
<button id="btn3"> 点我添加一个人</button>
<input id="person_name" type="test" placeholder="请输入名字"> </input>
<input id="person_age" type="test" placeholder="请输入年龄"> </input>
<button id="btn4"> 点我更新一个人</button>
<input id="person_update_id" type="test" placeholder="请输入id"> </input>
<input id="person_update_name" type="test" placeholder="请输入名字"> </input>
<input id="person_update_age" type="test" placeholder="请输入年龄"> </input>
<button id="btn5"> 点我删除一个人</button>
<input id="person_delete_id" type="test" placeholder="请输入闪删除的的id"> </input>
const btn1 = document.getELementById('btn1')
const btn2 = document.getELementById('btn2')
const btn3 = document.getELementById('btn3')
const btn4 = document.getELementById('btn4')
const btn4 = document.getELementById('btn4')
const btn5 = document.getELementById('btn5')
const personId = document.getElementByid('person_id')
const personName = document.getElementByid('person_name')
const personAge = document.getElementByid('person_age')
const personUpdateId = document.getElementByid('person_update_id')
const personUpdateName = document.getElementByid('person_update_name')
const personUpdateAge = document.getElementByid('person_update_age')
const personDeleteId = document.getElementByid('person_delete_id')
# 获取所有人信息-发送GET请求-不携带参数
btn1.onclick=()=>{
# 完整版
axios({
url:'http://localhost:5000/test1?delay=5000',//请求地址,延迟5秒
method:'GET',
timeout:2000,
}).then(
response=>{ console.log('请求成功了!',response.data);},
error=>{console.log('请求失败了!',error);}
)
# 精简版
axios.get('http://localhost:5000/person').then(
response=>{ console.log('请求成功了!',response.data); },error);}
)
}
#获取某个人的信息-发送GET请求-携带query参数
btn2.onclick=()=>{
# 完整版
axios({
url:'http://localhost:5000/person',
method:'GET',
params:{id:personId.value}
# 此处写的是params,但是携带的是query参数
}).then(
response=>{ console.log('请求成功了!',error);}
)
# 精简版
axios.get('http://localhost:5000/person',{params:{id:personId.value} }).then(
response=>{ console.log('请求成功了!',error);}
)
}
# 添加一个人,年龄和名字--发送POST请求--携带json编码参数或urlencoded编码
btn3.onclick=()=>{
# 完整版
axios({
url:'http://localhost:5000/person',
method:'POST',
# 1. 携带请求体参数,json编码
data:{name:personName.value,age:personAge}
# 2. 携带请求体参数,urlencoded编码
data:`name=${personName.value}&age=${personAge.value}`
}).then(
response=>{ console.log('请求成功了!',error);}
)
# 精简版
# 1. 携带请求体参数,json编码
axios.post('http://localhost:5000/person',
{name:personName.value,age:personAge} ).then(
# 2. 携带请求体参数,urlencoded编码
axios.post('http://localhost:5000/person',
`name=${personName.value}&age=${personAge.value}`).then(
response=>{ console.log('请求成功了!',error);}
)
}
# 更新某个人--发送PUT请求--携带json编码参数或urlencoded编码
btn4.onclick=()=>{
# 完整版
axios({
url:'http://localhost:5000/person',
method:'PUT',
data:{id:personUpdateId.value,
name:personUpdateName.value,
age:personUpdateAge.value,
}
}).then(
response=>{ console.log('请求成功了!',error);}
)
# 精简版
axios.put('http://localhost:5000/person',{id:personUpdateId.value,
age:personUpdateAge.value}).then(
response=>{ console.log('请求成功了!',error);}
)
}
# 删除某个人--发送DELETE请求--携带parmas
btn5.onclick=()=>{
# 完整版
axios({
url:`http://localhost:5000/person/${personDeleteId.value}`,
method:'DELETE',
}).then(
response=>{ console.log('请求成功了!',error);}
)
}
3.3 axios常用配置项
axios.defaults.xxx:
请求的默认全局配置
<script type = "text/javascript" src="./js/axios.min.js"></script>
# 给 axios配置默认配置
axios.defaults.timeout = 2000
axios.defaults.headers = {name:atjm}
axios.defualts.baseURL='http://localhost:5000'
<button id="btn"> 点我获取所有人</button>
const btn1 = document.getELementById('btn')
btn.onclick=()=>{
# 完整版
axios({
url:'http://localhost:5000/person',//请求地址, //请求方式
//params:{a:1,b:2},//配置query
//data:{a:3,d:3},//配置请求体 参数 (json)
//data:'e=5&f=6' //配置请求体参数(urlencoded)
timeout:2000, //配置超时时间
header:{demo:123} //配置请求头
responseType:'json' //配置相应数据格式(默认值)
}).then(
response=>{ console.log('请求成功了!',error);}
)
}
3.4 axios.create
方法
axios.create([config])
:创建一个新的axios(它没有下面的功能)
axios.create(config)
const axios2 =axios.create({
timeout: 2000
//headers: {name:atjm}
baseURL:'http://localhost:5000'
})
# 需要放在defaluts前方
btn.onclick=()=>{
# 完整版
axios2({
url:'http://localhost:5000/person',error);}
)
}
3.5 axios
中的拦截器
axios
请求拦截器
axios
响应拦截器
拦截器函数/
ajax
请求/请求的回调函数的调用顺序
说明: 调用axios()
并不是立即发送ajax
请求,而是需要经历一个较长的流程
流程: 请求拦截器2 => 请求拦截器1 => 发ajax
请求 => 响应拦截器1 => 响应拦截器2 => 请求的回调
注意: 此流程是通过promise
串连起来的,请求拦截器传递的是config
,响应拦截器传递的是response
————————————————
#请求拦截器
axios.interceptors.request.use((config)=>{
if(Date.Now()%2===0){
config.headers.token='atuge'
}
return config;
})
# 响应拦截器
axios.interceptors.response.use(
response=>{
console.log('相应拦截器成功的回掉执行了',response)
if(Date.Now()%2===0) return response.data
else return '时间戳不是偶数,不能给你数据'
},
error=>{
console.log('相应拦截器失败的回掉执行了')
alert(error)
return new Promise(()=>{})
}
)
btn.onclick=() async() =>{
const result =await axios.get('http://localhost:5000/person')
console.log(result);
}
3.6 axios
中取消请求
取消请求1
let cancel;
btn1.onclick=() async() =>{
# 完整版
axios({
url:'http://localhost:5000/person',
cancelToken:new CancelToken((c)=>{
console.log(c) //c是一个函数,调用c可以关闭本次请求
cancel=c
})
}).then(
response=>{ console.log('请求成功了!',error);}
)
}
btn2.onclick=()=>{
cancel('任性,就是不要了')
}
取消请求2
#CancelToken 能为一次请求“打标注"
const {CancelToken,isCancel}= axios
let cancel;
btn1.onclick=() async() =>{
if(cancel) cancel()
axios({
url:'http://localhost:5000/test?delay=3000',
error=>{
if(isCancel(error))
console.log('用户取消了请求,原因是',error,message)
else
console.log('请求失败了!',error);}
)
}
btn2.onclick=()=>{
cancel('任性,就是不要了')
}
取消请求3 取消请求+拦截器
#CancelToken 能为一次请求“打标注"
const {CancelToken,isCancel}= axios
let cancel;
#请求拦截器
axios.interceptors.request.use((config)=>{
if(cancel) cancel('取消了')
config.CancelToken = new CancelToke((c)=> cancel=c)
return config;
})
# 响应拦截器
axios.interceptors.response.use(
response=>{ return response.data },
error=>{
if(isCancel(error))
console.log('用户取消了请求,原因是',error.message)
else
console.log('失败了',error)
return new Promise(()=>{})
}
)
btn1.onclick=() async() =>{
const result= await axios.get('http://localhost:5000/test?delay=3000')
}
btn2.onclick=()=>{
cancel('任性,就是不要了')
}
3.7 axios
批量发请求
btn1.onclick=() async() =>{
axios.all([
axios.get('http://localhost:5000/test'),
axios.get('http://localhost:5000/test2?delay=3000'),
axios.get('http://localhost:5000/test3')
]).then(
response=>{ console.log('请求成功了!',error);}
)
}