简介
https://www.axios-http.cn/docs/intro
安装
方式1
1 | npm install axios |
引用
1 | import axios from "axios"; |
方式2
1 | <script src="https://unpkg.com/axios/dist/axios.min.js"></script> |
调用
1 | window.axios.get("https://www.psvmc.cn").then(res => { |
axios实例
建议不同的接口配置不同的实例,特别时普通接口请求和文件接口。
主要是因为:
- 接口地址不一样。
- 超时时间不一样。
配置文件
public文件夹中放我们的配置文件
1 | window.baseURL = "http://192.168.3.80:9999/"; |
index.html中引用
1 | <script src="/config.js"></script> |
注意
不要使用导入导出的方式,否则打包后修改配置文件也不生效。
工具类
src/assets/js/axios_utils.js
1 | import axios from "axios"; |
调用
调用的接口
src/assets/js/m_api.js
1 | import axios from "@/assets/js/axios_utils"; |
页面中获取配置项或接口
1 | import { api_user_login } from "@/assets/js/m_api"; |
几种传参方式
URL传参
1 | let url = `/login?userid=${this.userId}&subject=${this.subject}` |
application/json
如果没有特别声明,application/json是Axios默认的Content-Type,也是最常用的一种,它声明了请求体中的数据将会以json字符串的形式发送到后端。
1 | var params = { |
application/x-www-form-urlencoded
Content-Type:application/x-www-form-urlencoded,则声明了请求体中的数据会以键值对(普通表单形式)发送到后端,这种类型是Ajax默认的。
偶尔后端需要我要传键值对给他们,那这个时候,就需要在头部设置headers: { 'Content-Type':'application/x-www-form-urlencoded'}
,
然后,将请求体中的数据设置为键值对。但是我们封装的请求体一般是JSON对象,这个时候,就可以使用qs库将对象转为url参数形式。
请求示例
1 | import axios from "axios"; |
或者
1 | import axios from "axios"; |
qs是Axios默认就有的,就不需要再npm了。
1 | import qs from 'qs'; |
QS的用法
参数字符串转对象
1 | var url='userId=admin&password=hellworld'; |
对象转参数字符串
1 | var person = {name:'lihua',age:18}; |
multipart/form-data
只要使用FormData对象,axios就会把请求头中设置为'Content-Type': 'multipart/form-data'
1 | let formData = new FormData(); |
当然我们也可以自己指定1
2
3
4
5
6
7
8
9
10
11
12
13let formData = new FormData();
formData.append('file', document.querySelector('input[type=file]').files[0]);
formData.append('username', 'admin');
formData.append('password', '123456');
axios({
url: '/XXXX/XXXX',
method: 'post',
headers: {
'Content-Type': 'multipart/form-data'
},
data: formData
})
headers
1 | let headers = { |
文件上传
方法
api_common.ts
1 | import axios from './axios_utils.js' |
单独文件上传
HTML
1 | <input class="file" name="file" type="file" accept="image/png,image/gif,image/jpeg" @change="uploadFileAction"/> |
JS
1 | import axios from "axios"; |
其中file对象中我们能取到
1 | name: "7.png" |
图片校验
1 | uploadImg(e) { |
类型校验
zip
1 | uploadImg(e) { |
注意不符合要求时清空所选文件
1 | e.target.value = null; |
图片预览
1 | uploadImg(e) { |
表单文件上传
HTML
1 | <form> |
JS
1 | data: { |
拦截器
1 | const axios = require("axios"); |
请求拦截器
1 | http.interceptors.request.use( |
响应拦截器
1 | http.interceptors.response.use( |
自定义请求头Header
1 | axios.defaults.headers.post["version"] = window.baseconfig.version; |
或者
1 | http.interceptors.request.use( |
或者
1 | const http = axios.create({ |
添加自定义Header需要后端接口允许,否则会报错
Request header field version is not allowed by Access-Control-Allow-Headers in preflight response.
后端
1 | import java.io.IOException; |
获取响应头
使用 respose.headers
拿到的只用两个默认的headers, 尝试了使用捕获响应头的方法
1 | axios.interceptors.response.use(function (response) { |
结果打印出来的还是
1 | Object { |
原因是:
在默认的请求上, 浏览器只能访问以下默认的响应头
- Cache-Control
- Content-Language
- Content-Type
- Expires
- Last-Modified
- Pragma
如果想让浏览器能访问到其他的响应头的话 需要在服务器上设置 Access-Control-Expose-Headers
1 | Access-Control-Expose-Headers : 'Authorization' |
多个用逗号分割
1 | Access-Control-Expose-Headers : "Authorization,Cache" |
前端成功获取Authorization
Java代码
1 | response.setHeader("Access-Control-Expose-Headers", "Authorization"); |
但是注意的是
响应中的首字母大写,在获取的时候变成了小写,如下:
1 | myhttp.interceptors.response.use( |
请求体多了双引号
提交body raw格式
全局配置
1 | const http = axios.create({ |
单个请求
1 | axios.post('/air/point/saveOrUpdate', JSON.stringify(params), { |
在做接口加密的时候,如下我们把请求体加密为字符串了,但是发起请求的时候,字符串会多了两个双引号,
原因是
axios会把请求题转换为设置的请求体格式,因为设置的是JSON所以,他就转成了JSON对象。
如下:
1 | http.interceptors.request.use( |
Nginx允许自定义响应标头
注意如果接口已经配置过了,Nginx上就不要配置,否则会导致接口无法请求。
Nginx中在响应中添加如下Header
1 | location / { |
其中:
Access-Control-Allow-Headers
是允许的响应标头。Access-Control-Max-Age
,用来指定本次预检请求的有效期,单位为秒。上面配置中,有效期是10小时(36000秒),在此期间,不用发出另一条预检请求。Access-Control-Allow-Origin
只能设置为三种情况:星号 *
、单域名
、none
。同时还有一个限制就是设置为星号的时候,Access-Control-Allow-Credentials
不能设置为true
。Access-Control-Allow-Credentials
则一般是服务器用来设置是否允许前端携带Cookies的标志位。
TS中使用
定义接口的返回类型
1 | interface ZResult<T> { |
公共接口文件
common_api.ts
1 | import axios from './axios_utils.js' |