Axios从放弃到知根知底
Axios是什么
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
如何安装
有以下几种安装方式
1.npm安装
npm install axios
2.bower安装
bower install axios
3.yarn安装
$ yarn add axios
3.使用CDN:
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
4.使用unpkg CDN:(个人不推荐使用)
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
一切都从Hello World开始
这个是本人编写的api接口,在这里将会成为我们第一个部分的实例
api.catci.buzz/io/test
一个极其平常的页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
crossorigin="anonymous">
</head>
<body>
<div class="container my-5">
<div class="text-center">
<h1 class="display-4 text-center mb-3">Axios全方位解析</h1>
<button class="btn btn-primary my-3" id="get">GET</button>
<button class="btn btn-info" id="post">POST</button>
<button></button>
</div>
</div>
<div id="res"></div>
<!--以下使用CDN进行引用-->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
// 在这里写我们的axios代码
</script>
页面效果
在script下添加如下代码
// 请求接口
var oGet = document.getElementById('get')
var oPost = document.getElementById('post')// 先放着
oGet.onclick = function(){
axios({
method:"get",
url: "http://api.catci.buzz/io/test",
params:{
lang:CSDN
}
}).then(res => showOutput(res)) // 成功执行函数
.catch(err => console.log(err)) // 失败执行函数
}
function showOutput(res){
document.getElementById("res").innerHTML =`
<div class="card card-body mb-4">
<h5>Status: ${res.status}</h5>
</div>
<div class="card mt-3">
<div class="card-header">
Headers
</div>
<div class="card-body">
<pre>${JSON.stringify(res.headers,null,2)}</pre>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
Data
</div>
<div class="card-body">
<pre>${JSON.stringify(res.data,null,2)}</pre>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
Config
</div>
<div class="card-body">
<pre>${JSON.stringify(res.config,null,2)}</pre>
</div>
</div>
`
页面预览
Post请求
从上面的实例中我们知道了在Axios中如何发送get请求
我们将会使用JSONplaceholder提供的io接口来写下面的示例代码
script添加如下代码
oPost.onclick = function(){
axios({
method:"post",
url: "http://jsonplaceholder.typicode.com/todos",
params:{
title:'Hello World',
completed:false
}
}).then(res => showOutput(res))
.catch(err => console.log(err))
}
没有什么特别难的地方,不再过多讲解
PUT/PATCH请求以及删除请求数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
crossorigin="anonymous">
</head>
<body>
<div class="container my-5">
<div class="text-center">
<h1 class="display-4 text-center mb-3">Axios全方位解析</h1>
<button class="btn btn-primary my-3" id="get">GET</button>
<button class="btn btn-info" id="post">POST</button>
<button class="btn btn-info" id="put">PUT/PATCH</button>
<button class="btn btn-warning" id="del">DELETE</button>
</div>
</div>
<div id="res"></div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
// 请求接口
var oGet = document.getElementById('get')
var oPost = document.getElementById('post')
var oPut = document.getElementById('put')
var oDel = document.getElementById('del')
oGet.onclick = function(){
axios({
method:"get",
url: "http://jsonplaceholder.typicode.com/todos",
params:{
_limit:5
}
}).then(res => showOutput(res))
.catch(err => console.log(err))
}
oPost.onclick = function(){
axios({
method:"post",
url: "http://jsonplaceholder.typicode.com/todos",
params:{
title:'Hello World',
completed:false,
timeout:5000
}
}).then(res => showOutput(res))
.catch(err => console.log(err))
}
oPut.onclick = function(){
axios.patch("http://jsonplaceholder.typicode.com/todos/1",{
title:"Hello World",
completed:true
})
.then(res => showOutput(res))
.catch(err => console.errer(err))
}
oDel.onclick = function(){
axios.delete("http://jsonplaceholder.typicode.com/todos/1")
.then(res => showOutput(res))
.catch(err => console.errer(err))
}
// 数据展示
function showOutput(res){
document.getElementById("res").innerHTML =`
<div class="card card-body mb-4">
<h5>Status: ${res.status}</h5>
</div>
<div class="card mt-3">
<div class="card-header">
Headers
</div>
<div class="card-body">
<pre>${JSON.stringify(res.headers,null,2)}</pre>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
Data
</div>
<div class="card-body">
<pre>${JSON.stringify(res.data,null,2)}</pre>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
Config
</div>
<div class="card-body">
<pre>${JSON.stringify(res.config,null,2)}</pre>
</div>
</div>
`
}
</script>
</body>
</html>
put返回
{
"url": "http://jsonplaceholder.typicode.com/todos/1",
"method": "patch",
"data": "{\"title\":\"Hello World\",\"completed\":true}",
"headers": {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/json;charset=utf-8"
},
"transformRequest": [
null
],
"transformResponse": [
null
],
"timeout": 0,
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
"maxContentLength": -1
}
delete返回空对象
批量请求
html添加如下代码
<button class="btn" style="background: grey;" id="batch">批量请求</button>
<button class="btn" style="background: grey;" id="headers">Headers</button>
<button class="btn" style="background: grey;" id="transform">TRANSFORM</button>
<button class="btn" style="background: grey;" id="control">ERR-CONTROL</button>
<button class="btn" style="background: grey;" id="cancel">请求取消</button>
Javascript
// 请求接口
var oGet = document.getElementById('get')
var oPost = document.getElementById('post')
var oPut = document.getElementById('put')
var oDel = document.getElementById('del')
var oBatch = document.getElementById('batch')
var oHeaders = document.getElementById('headers')
var oTransform = document.getElementById('transform')
var oControl = document.getElementById('control')
var oCancel = document.getElementById('cancel')
oGet.onclick = function(){
axios({
method:"get",
url: "http://jsonplaceholder.typicode.com/todos",
params:{
_limit:5
}
}).then(res => showOutput(res))
.catch(err => console.log(err))
}
oPost.onclick = function(){
axios({
method:"post",
url: "http://jsonplaceholder.typicode.com/todos",
params:{
title:'Hello World',
completed:false,
timeout:5000
}
}).then(res => showOutput(res))
.catch(err => console.log(err))
oPut.onclick = function(){
axios.patch("http://jsonplaceholder.typicode.com/todos/1",{
title:"Hello World",
completed:true
})
.then(res => showOutput(res))
.catch(err => console.errer(err))
}
oDel.onclick = function(){
axios.delete("http://jsonplaceholder.typicode.com/todos/1")
.then(res => showOutput(res))
.catch(err => console.errer(err))
}
oBatch.onclick = function(){
// axios.all返回一个数组
axios.all([
axios.get('http://jsonplaceholder.typicode.com/todos?_limit=5'),
axios.get('http://jsonplaceholder.typicode.com/posts?_limit=5')
])
// then通过索引获取数组内元素
.then(res => showOutput(res[0]))
.catch(err => console.error(err))
}
// 数据展示
function showOutput(res){
document.getElementById("res").innerHTML =`
<div class="card card-body mb-4">
<h5>Status: ${res.status}</h5>
</div>
<div class="card mt-3">
<div class="card-header">
Headers
</div>
<div class="card-body">
<pre>${JSON.stringify(res.headers,null,2)}</pre>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
Data
</div>
<div class="card-body">
<pre>${JSON.stringify(res.data,null,2)}</pre>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
Config
</div>
<div class="card-body">
<pre>${JSON.stringify(res.config,null,2)}</pre>
</div>
</div>
`
}
自定义请求头
js添加如下代码
oHeaders.onclick = function(){
axios.post("http://jsonplaceholder.typicode.com/todos",{
title:"Hello World",
completed:true
},{
headers:{
"Content-Type":"application/json"
}
})
.then(res => showOutput(res))
.catch(err => console.error(err))
}
Transform
oTransform.onclick = function(){
axios({
method:"post",
url:"http://jsonplaceholder.typicode.com/todos",
data:{
title:"Hello World"
}
})
.then(res => showOutput(res))
}
再此基础上我们可以在请求层对响应进行转化
oTransform.onclick = function(){
// axios({
// method:"post",
// url:"http://jsonplaceholder.typicode.com/todos",
// data:{
// title:"Hello World"
// }
// })
// .then(res => showOutput(res))
axios({
method:"post",
url:"http://jsonplaceholder.typicode.com/todos",
data:{
title:"Hello World"
},
transformResponse: axios.defaults.transformResponse.concat(data => {
data.title = data.title.toUpperCase()
return data
})
}).then(res => showOutput(res))
}
Error处理
oControl.onclick = function(){
axios({
method:"get",
url: "http://jsonplaceholder.typicode.com/todoss",
params:{
_limit:5
}
})
.then(res => showOutput(res))
.catch(err => {
if (err.response){
console.log(err.response.data)
console.log(err.response.status)
console.log(err.response.headers)
if (err.response.status == 404){
alert('客户端出现错误')
}else if (err.response.status == 500){
alert('服务端接口出现问题')
}
}else if(err.request){
console.error(err.request)
}else{
console.error(err.message)
}
})
}
请求取消
生成一个token并设置为axios请求参数
https://jwt.io/
javascript添加如下代码
//定义token
axios.defaults.headers.common['X-Auth-Token'] =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
oCancel.onclick = function(){
axios({
method:"get",
url: "http://jsonplaceholder.typicode.com/todos",
params:{
cancelToken:axios.CancelToken.source().token,
_limit:5
}
}).then(res => showOutput(res))
.catch(thrown => {
if(axios.isCancel(thrown)){
console.log('request canceld',thrown.message)
}
})
}
请求拦截
Javascript添加如下
// 请求拦截
axios.interceptors.request.use(config => {
console.log(`${config.method.toUpperCase()} request sent to ${config.url} at ${new Date()
.getTime()}`)
return config
},error => {return Promise.reject(error)})
总代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
crossorigin="anonymous">
</head>
<body>
<div class="container my-5">
<div class="text-center">
<h1 class="display-4 text-center mb-3">Axios全方位解析</h1>
<button class="btn btn-primary my-3" id="get">GET</button>
<button class="btn btn-info" id="post">POST</button>
<button class="btn btn-info" id="put">PUT/PATCH</button>
<button class="btn btn-warning" id="del">DELETE</button>
<button class="btn" style="background: grey;" id="batch">批量请求</button>
<button class="btn" style="background: grey;" id="headers">Headers</button>
<button class="btn" style="background: grey;" id="transform">TRANSFORM</button>
<button class="btn" style="background: grey;" id="control">ERR-CONTROL</button>
<button class="btn" style="background: grey;" id="cancel">请求取消</button>
</div>
</div>
<div id="res"></div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
// 请求接口
var oGet = document.getElementById('get')
var oPost = document.getElementById('post')
var oPut = document.getElementById('put')
var oDel = document.getElementById('del')
var oBatch = document.getElementById('batch')
var oHeaders = document.getElementById('headers')
var oTransform = document.getElementById('transform')
var oControl = document.getElementById('control')
var oCancel = document.getElementById('cancel')
//定义token
axios.defaults.headers.common['X-Auth-Token'] =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
oGet.onclick = function(){
axios({
method:"get",
url: "http://jsonplaceholder.typicode.com/todos",
params:{
_limit:5
}
}).then(res => showOutput(res))
.catch(err => console.log(err))
}
oPost.onclick = function(){
axios({
method:"post",
url: "http://jsonplaceholder.typicode.com/todos",
params:{
title:'Hello World',
completed:false,
timeout:5000
}
}).then(res => showOutput(res))
.catch(err => console.log(err))
}
oPut.onclick = function(){
axios.patch("http://jsonplaceholder.typicode.com/todos/1",{
title:"Hello World",
completed:true
})
.then(res => showOutput(res))
.catch(err => console.errer(err))
}
oDel.onclick = function(){
axios.delete("http://jsonplaceholder.typicode.com/todos/1")
.then(res => showOutput(res))
.catch(err => console.errer(err))
}
oBatch.onclick = function(){
axios.all([
axios.get('http://jsonplaceholder.typicode.com/todos?_limit=5'),
axios.get('http://jsonplaceholder.typicode.com/posts?_limit=5')
])
.then(res => showOutput(res[0]))
.catch(err => console.error(err))
}
oHeaders.onclick = function(){
axios.post("http://jsonplaceholder.typicode.com/todos",{
title:"Hello World",
completed:true
},{
headers:{
"Content-Type":"application/json"
}
})
.then(res => showOutput(res))
.catch(err => console.error(err))
}
oTransform.onclick = function(){
// axios({
// method:"post",
// url:"http://jsonplaceholder.typicode.com/todos",
// data:{
// title:"Hello World"
// }
// })
// .then(res => showOutput(res))
axios({
method:"post",
url:"http://jsonplaceholder.typicode.com/todos",
data:{
title:"Hello World"
},
transformResponse: axios.defaults.transformResponse.concat(data => {
data.title = data.title.toUpperCase()
return data
})
}).then(res => showOutput(res))
}
oControl.onclick = function(){
axios({
method:"get",
url: "http://jsonplaceholder.typicode.com/todoss",
params:{
_limit:5
}
})
.then(res => showOutput(res))
.catch(err => {
if (err.response){
console.log(err.response.data)
console.log(err.response.status)
console.log(err.response.headers)
if (err.response.status == 404){
alert('客户端出现错误')
}else if (err.response.status == 500){
alert('服务端接口出现问题')
}
}else if(err.request){
console.error(err.request)
}else{
console.error(err.message)
}
})
}
oCancel.onclick = function(){
axios({
method:"get",
url: "http://jsonplaceholder.typicode.com/todos",
params:{
cancelToken:axios.CancelToken.source().token,
_limit:5
}
}).then(res => showOutput(res))
.catch(thrown => {
if(axios.isCancel(thrown)){
console.log('request canceld',thrown.message)
}
})
}
// 请求拦截
axios.interceptors.request.use(config => {
console.log(`${config.method.toUpperCase()} request sent to ${config.url} at ${new Date()
.getTime()}`)
return config
},error => {return Promise.reject(error)})
// 数据展示
function showOutput(res){
document.getElementById("res").innerHTML =`
<div class="card card-body mb-4">
<h5>Status: ${res.status}</h5>
</div>
<div class="card mt-3">
<div class="card-header">
Headers
</div>
<div class="card-body">
<pre>${JSON.stringify(res.headers,null,2)}</pre>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
Data
</div>
<div class="card-body">
<pre>${JSON.stringify(res.data,null,2)}</pre>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
Config
</div>
<div class="card-body">
<pre>${JSON.stringify(res.config,null,2)}</pre>
</div>
</div>
`
}
</script>
</body>
</html>