axios简介
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。一、特点:从浏览器中创建XMLHttpRequests从node.js创建http请求支持PromiseAPI拦截请求和响应转换请求数据和响应数据取消请求自动转换JSON数据客户端支持防御XSRF二、使用:1.npm 安装:npm install ax...
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
一、特点:
- 从浏览器中创建XMLHttpRequests
- 从node.js创建http请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换JSON数据
- 客户端支持防御XSRF
二、使用:
1.npm 安装:
npm install axios --save-dev
2.CDN方式使用:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
三、在vue中使用:
1.局部使用:在组件中引入axios直接使用即可,但是我们一般将其挂载到全局
2.全局挂载:
- 在main.js中:
import axios from 'axios' import VueAxios from 'vue-axios' Vue.use(VueAxios,axios);
然后在组件中使用this.axios即可调用
-
在main中将axios挂载到vue的原型上:
import axios from 'axios' Vue.prototype.$ajax= axios
然后再组件中使用this.$ajax即可调用
四、简单示例(基本的使用):
- 发送请求
//xxxxxx为请求地址 axios.get('xxxxxx') .then((data)=>{ console.log(data); }) .catch((error)=>{ console.log(error); }); // 上面的请求可以这样做 axios.get('/user', { params: { user: 'liuhua' } }) .then((data)=>{ console.log(data); }) .catch((error)=>{ console.log(error); });
- params会将请求的参数加入到下图里面去,即使是put,post等请求
- 执行多个并发请求:
function getUserAccount() {
return axios.get('/user/liuhua');
}
function getUserPermissions() {
return axios.get('/user/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {
// 两个请求现在都执行完成
})
.catch(err=>{
//console.log(err);
})
);
五、axios常用的请求方法:
-
get:获取数据
-
post:提交数据(表单+文件上传等)
-
put:更新数据(将所有的数据推送到后端)
-
patch:更新数据(只将修改的数据推送到后端)
-
delete:删除数据
这只是一种规范,我们也完全可以通过post方法去修改数据,删除数据等。
六、创建axios实例:
当我们后端接口域名不止一个,或者超时时长不一样的时候就可以通过创建axios实例
//实例1
let instance=axios.create({
baseURL:'http://localhost:8080',
timeout:1000 //超时时长,如果发起http请求,超过这个时间还未收到数据,就会报错(超时错误)
})
instance.get('xxxxx').then(data=>{}).catch(err=>{})
//实例2
let axios2=axios.create({
baseURL:'http://localhost:8081',
timeout:2000
})
axios2.get('xxxxx').then(data=>{}).catch(err=>{})
1.axios全局配置:
axios.defaults.timeout=3000;
axios.defaults.baseURL='http://localhost:3000';
2.axios实例配置:
let instance=axios.create({
baseURL:'http://localhost:3031',
timeout:5000
})
实例已经创建完成,想要修改配置项
instance.defaults.timeout=3000;
3.axios请求配置:
axios.get('/data.json',{
timeout:15000
})
优先级为 请求配置 > 实例配置 > 全局配置
可用配置参数:(这里借鉴https://www.kancloud.cn/yunye/axios/234845)
{
url: '/user', //请求路径
method: 'get', // 请求方法,默认是 get
baseURL: 'https://some-domain.com/api/', //接口域名`baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL
timeout:1000, //请求的超时时长(ms)
headers:{}, //设置请求头
params:{}, //请求参数拼接到url上
data:{}, //请求参数放到请求体里
withCredentials: false, // 默认的,withCredentials` 表示跨域请求时是否需要使用凭证
transformRequest: [function (data) { //允许在向服务器发送前,修改请求数据;只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法;后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
// 对 data 进行任意转换处理
return data;
}],
transformResponse: [function (data) { // 在传递给 then/catch 前,允许修改响应数据
// 对 data 进行任意转换处理
return data;
}],
paramsSerializer: function(params) { //是一个负责 `params` 序列化的函数
return Qs.stringify(params, {arrayFormat: 'brackets'})
},
adapter: function (config) { //允许自定义处理请求,以使测试更轻松
/* ... */
},
auth: { //表示应该使用 HTTP 基础验证,并提供凭据,这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头
username: 'janedoe',
password: 's00pers3cret'
},
responseType: 'json', // 默认的,表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
xsrfCookieName: 'XSRF-TOKEN', // default ,是用作 xsrf token 的值的cookie的名称
xsrfHeaderName: 'X-XSRF-TOKEN', // 默认的,是承载 xsrf token 的值的 HTTP 头的名称
onUploadProgress: function (progressEvent) { //允许为上传处理进度事件
// 对原生进度事件的处理
},
onDownloadProgress: function (progressEvent) { //允许为下载处理进度事件
// 对原生进度事件的处理
},
maxContentLength: 2000, //定义允许的响应内容的最大尺寸
validateStatus: function (status) { //定义对于给定的HTTP 响应状态码是 resolve 或 reject promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte
return status >= 200 && status < 300; // 默认的
},
maxRedirects: 5, // 默认的,定义在 node.js 中 follow 的最大重定向数目
httpAgent: new http.Agent({ keepAlive: true }), //`httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:
httpsAgent: new https.Agent({ keepAlive: true }),
proxy: { //'proxy' 定义代理服务器的主机名称和端口;`auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据;这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。
host: '127.0.0.1',
port: 9000,
auth: : {
username: 'mikeymike',
password: 'rapunz3l'
}
},
cancelToken: new CancelToken(function (cancel) { //指定用于取消请求的 cancel token
})
}
七、axios拦截器:
在请求或响应被处理前拦截他们==>请求拦截器,响应拦截器
请求拦截器:
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
响应拦截器:
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
移除拦截器:
var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
例子:
//需要登录的接口
let instance=axios.create();
instance.interceptors.request.use({
(config=>{
config.headers.token='';
return config;
})
})
//不需要登录的接口
let instances2 = axios.create()
这样我们就可以通过instance实例来访问需要登录的接口,通过instance2来访问不需要登录的接口
八、错误处理:
在请求错误时进行的处理
axios.get('/user/12345')
.catch(function (error) {
if (error.response) {
// 请求已发出,但服务器响应的状态码不在 2xx 范围内
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
}
console.log(error.config);
});
可以使用 validateStatus
配置选项定义一个自定义 HTTP 状态码的错误范围。
axios.get('/user/12345', {
validateStatus: function (status) {
return status < 500; // 状态码在大于或等于500时才会 reject
}
})
在实际开发中,一般添加统一的错误处理
let instance=axios.create();
instance.interceptors.request.use(
config=>{
return config;
},err=>{
//请求错误,一般http状态码以4开头
return Promise.reject(err)
}
)
instance.interceptors.response.use(
res=>{
return res;
},err=>{
//响应错误处理,一般http状态码以5开头
$('#err_box').show(); //如果错误就让提示框显示
return Promise.reject(err);
}
)
九、取消请求:
用于取消正在进行的http请求,在实际开发中使用并不多
使用 cancel token 取消请求
可以使用 CancelToken.source
工厂方法创建 cancel token
var CancelToken = axios.CancelToken;
var source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(function(thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// 处理错误
}
});
// 取消请求(message 参数是可选的,取消请求的信息,会进入到上面例子中的thrown.message中)
source.cancel('Operation canceled by the user.');
还可以通过传递一个 executor 函数到 CancelToken
的构造函数来创建 cancel token:
var CancelToken = axios.CancelToken;
var cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c) {
// executor 函数接收一个 cancel 函数作为参数
cancel = c;
})
});
// 取消请求
cancel();
本文大量借鉴:https://www.kancloud.cn/yunye/axios/234845
更多推荐
所有评论(0)