【Axios】实例带你从放弃到知根知底(1)

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>
JavaScript中,axios是一个基于Promise的HTTP客户端,用于浏览器和node.js中发起HTTP请求。自定义axios实例通常涉及创建一个axios实例,并对这个实例进行配置以满足特定需求。以下是创建和配置axios实例的基本步骤: 1. 首先,需要安装axios库。如果是在Node.js环境中,可以使用npm或yarn命令安装。在浏览器中则可以通过script标签引入axios的CDN链接。 2. 创建axios实例: ```javascript const axios = require('axios'); // Node.js环境 // 或者在浏览器中引入axios // <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> const instance = axios.create({ baseURL: 'https://api.example.com', // 基础URL timeout: 1000, // 请求超时时间 headers: {'X-Custom-Header': 'foobar'} // 自定义请求头 }); ``` 3. 配置实例。创建实例后,可以根据需要对其添加拦截器,以便在请求发送前或响应接收后执行一些操作。 添加请求拦截器: ```javascript instance.interceptors.request.use(function (config) { // 在发送请求之前做些什么,例如添加token config.headers.Authorization = 'Bearer your-token'; return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); ``` 添加响应拦截器: ```javascript instance.interceptors.response.use(function (response) { // 对响应数据做点什么 return response; }, function (error) { // 对响应错误做点什么 return Promise.reject(error); }); ``` 4. 使用自定义的axios实例发起请求: ```javascript instance.get('/users') .then(response => { // 处理成功的响应 console.log(response.data); }) .catch(error => { // 处理错误 console.error(error); }); ``` 自定义axios实例的好处是,可以针对不同的API或不同环境(如开发环境和生产环境)创建不同的配置,提高代码的复用性,同时也可以为特定的HTTP请求提供一些通用的配置和功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值