内容简介:首先在接触前端的时候,用的网络框架是这个网络框架是基于http客户端的promise,面向浏览器和nodejs的。主要有如下几个优势:或者使用cdn
首先在接触前端的时候,用的网络框架是 vue-resource
,但是看到官网上面上面说这个官网已经不怎么维护了。所以我就转移阵地到axios了。从使用到封装,感觉性能还是挺不错的。
一、 axios介绍
这个网络框架是基于http客户端的promise,面向浏览器和nodejs的。主要有如下几个优势:
- 浏览器端发起XMLHttpRequests请求
- node端发起http请求
- 支持Promise API
- 监听请求和返回
- 转化请求和返回
- 取消请求
- 自动转化json数据
- 客户端支持抵御
二、 安装
npm install axios --save-dev 复制代码
或者使用cdn
<script src="https://unpkg.com/axios/dist/axios.min.js"></script> 复制代码
三、 先来个示例
先来一个 get
请求
axios.get('/user',{
params:{
name:'klivitam'
}
}).then(function(response){
console.log(response);
}).catch(function(error){
console.log(error)
}
复制代码
然后再来一个 post
请求
axios.post('/user',{
name:'klivitam',
address:'china'
})
.then(function(response){
console.log(response);
})
.catch(function(error){
console.log(error);
});
复制代码
来个并发的操作:
function getUserAccount(){
return axios.get('/user/12345');
}
function getUserPermissions(){
return axios.get('/user/12345/permissions');
}
axios.all([getUerAccount(),getUserPermissions()])
.then(axios.spread(function(acc,pers){
//两个请求现在都完成
}));
复制代码
四、 axios 基本方法:
上面这两段代码介绍了 get
和 post
,除此之外,其实axios还支持很多:
- axios.request(config)
- axios.get(url,[config])
- axios.delete(url,[config])
- axios.head(url,[config])
- axios.post(url,[data,[config]])
- axios.put(url,[data,[config]])
- axios.patch(url,[data,[config]])
五、 并发 Concurrency
- axios.all(iterable)
- axios.spread(callback)
六、 请求API配置
axios 能够在进行请求时进行一些设置。具体的代码如下
//发起 POST请求
axios({
method:'post',
url:'/user/12345',
data:{
name:'klivitam',
address:'china'
}
});
复制代码
七、 请求设置
以下列出了一些请求时的设置。只有 url 是必须的,如果没有指明的话,默认的请求方法是GET。
{
//`url`是服务器链接,用来请求用
url:'/user',
//`method`是发起请求时的请求方法
method:`get`,
//`baseURL`如果`url`不是绝对地址,那么将会加在其前面。
//当axios使用相对地址时这个设置非常方便
//在其实例中的方法
baseURL:'http://some-domain.com/api/',
//`transformRequest`允许请求的数据在传到服务器之前进行转化。
//这个也支持`PUT`,`GET`,`PATCH`方法。
//数组中的最后一个函数必须返回一个字符串,一个`ArrayBuffer`,或者`Stream`
transformRequest:[function(data){
//依自己的需求对请求数据进行处理
return data;
}],
//`transformResponse`允许返回的数据传入then/catch之前进行处理
transformResponse:[function(data){
//依需要对数据进行处理
return data;
}],
//`headers`是自定义的要被发送的头信息
headers:{'X-Requested-with':'XMLHttpRequest'},
//`params`是请求连接中的请求参数,必须是一个纯对象,或者URLSearchParams对象
params:{
ID:12345
},
//`paramsSerializer`是一个可选的函数,是用来序列化参数
//例如:(https://ww.npmjs.com/package/qs,http://api.jquery.com/jquery.param/)
paramsSerializer: function(params){
return Qs.stringify(params,{arrayFormat:'brackets'})
},
//`data`是请求提需要设置的数据
//只适用于应用的'PUT','POST','PATCH',请求方法
//当没有设置`transformRequest`时,必须是以下其中之一的类型(不可重复?):
//-string,plain object,ArrayBuffer,ArrayBufferView,URLSearchParams
//-仅浏览器:FormData,File,Blob
//-仅Node:Stream
data:{
firstName:'fred'
},
//`timeout`定义请求的时间,单位是毫秒。
//如果请求的时间超过这个设定时间,请求将会停止。
timeout:1000,
//`withCredentials`表明是否跨域请求,
//应该是用证书
withCredentials:false //默认值
//`adapter`适配器,允许自定义处理请求,这会使测试更简单。
//返回一个promise,并且提供验证返回(查看[response docs](#response-api))
adapter:function(config){
/*...*/
},
//`auth`表明HTTP基础的认证应该被使用,并且提供证书。
//这个会设置一个`authorization` 头(header),并且覆盖你在header设置的Authorization头信息。
auth:{
username:'janedoe',
password:'s00pers3cret'
},
//`responsetype`表明服务器返回的数据类型,这些类型的设置应该是
//'arraybuffer','blob','document','json','text',stream'
responsetype:'json',
//`xsrfHeaderName` 是http头(header)的名字,并且该头携带xsrf的值
xrsfHeadername:'X-XSRF-TOKEN',//默认值
//`onUploadProgress`允许处理上传过程的事件
onUploadProgress: function(progressEvent){
//本地过程事件发生时想做的事
},
//`onDownloadProgress`允许处理下载过程的事件
onDownloadProgress: function(progressEvent){
//下载过程中想做的事
},
//`maxContentLength` 定义http返回内容的最大容量
maxContentLength: 2000,
//`validateStatus` 定义promise的resolve和reject。
//http返回状态码,如果`validateStatus`返回true(或者设置成null/undefined),promise将会接受;其他的promise将会拒绝。
validateStatus: function(status){
return status >= 200 && stauts < 300;//默认
},
//`httpAgent` 和 `httpsAgent`当产生一个http或者https请求时分别定义一个自定义的代理,在nodejs中。
//这个允许设置一些选选个,像是`keepAlive`--这个在默认中是没有开启的。
httpAgent: new http.Agent({keepAlive:treu}),
httpsAgent: new https.Agent({keepAlive:true}),
//`proxy`定义服务器的主机名字和端口号。
//`auth`表明HTTP基本认证应该跟`proxy`相连接,并且提供证书。
//这个将设置一个'Proxy-Authorization'头(header),覆盖原先自定义的。
proxy:{
host:127.0.0.1,
port:9000,
auth:{
username:'cdd',
password:'123456'
}
},
//`cancelTaken` 定义一个取消,能够用来取消请求
//(查看 下面的Cancellation 的详细部分)
cancelToke: new CancelToken(function(cancel){
})
}
复制代码
八、 返回响应概要 Response Schema
一个请求的返回包含以下信息
{
//`data`是服务器的提供的回复(相对于请求)
data{},
//`status`是服务器返回的http状态码
status:200,
//`statusText`是服务器返回的http状态信息
statusText: 'ok',
//`headers`是服务器返回中携带的headers
headers:{},
//`config`是对axios进行的设置,目的是为了请求(request)
config:{}
复制代码
九、 拦截器 interceptors
你可以在 请求 或者 返回 被 then 或者 catch 处理之前对他们进行拦截。
//添加一个请求拦截器
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.rquest.eject(myInterceptor);
复制代码
你可以在一个axios实例中使用拦截器
var instance = axios.create();
instance.interceptors.request.use(function(){/*...*/});
复制代码
十、 取消 Cancellation
你可以使用 cancel token 取消一个请求
axios的cancel token API是基于 cnacelable promises proposal ,其目前处于第一阶段。 你可以使用 CancelToke.source 工厂函数创建一个cancel token,如下
var CancelToke = axios.CancelToken;
var source = CancelToken.source();
axios.get('/user/12345', {
cancelToken:source.toke
}).catch(function(thrown){
if(axiso.isCancel(thrown)){
console.log('Rquest canceled', thrown.message);
}else{
//handle error
}
});
//取消请求(信息参数设可设置的)
source.cancel("操作被用户取消");
复制代码
你可以给 CancelToken 构造函数传递一个executor function来创建一个cancel token:
var CancelToken = axios.CancelToken;
var cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c){
//这个executor 函数接受一个cancel function作为参数
cancel = c;
})
});
//取消请求
cancel();
复制代码
注意:你可以使用同一个cancel token取消多个请求。
十一、 简单的进行封装一下axios
前面大概都聊了一下axios的一些使用办法,但是作为一个 程序员 我还是希望能够封装代码,达到统一管理的目的。我是这样封装的。 service.js:
import * as myapi from "./apis"
const userModule = {
geyUser:{
method:"get",
url:myapi.USER_URL
}
};
const userApi = {...userModule}
export default {
userApi
}
复制代码
http.js:
import axios from 'axios'
import qs from 'qs' //格式化工具
import * as myapis from './apis' //apis统一配置
import store from '../store' // vuex
import router from '../router' // vue-router
import {
MessageBox,
Message
} from 'element-ui' // element-ui提示框
const errorCode = Array.of(458, 459, 457, 456, 455, 500, 400, 422, 460); //指定的错误代码
/**
* BASEURL:
*
* @type {前缀分类}
*/
const TYPE_BASE_URL = 0X100;
const TYPE_BASE_STAT_URL = 0X101;
const TYPE_BASE_SCORE_URL = 0X102;
const TYPE_BASE_AD_URL = 0X103;
axios.interceptors.request.use(config => {
if (typeof store.state.token === 'string') {
config.headers.Authorization = store.state.token //判断是否要加上token
}
return config
}, error => {
return Promise.reject(error)
});
axios.interceptors.response.use(response => {
return response
}, error => {
return Promise.resolve(error.response)
});
function failState(res) {
let errorTips = '请求失败,请稍后再试';
if (res) {
if (res.includes('F_responseMsg')) {
errorTips = res.data.F_responseMsg
}
}
MessageBox.alert(errorTips, '温馨提示', {
confirmButtonText: '确定',
callback: () => {
Message.error(errorTips)
}
})
return errorTips
}
function errorState(res) {
let errorTips = res.message
MessageBox.alert(errorTips, '温馨提示', {
confirmButtonText: '确定',
callback: () => {
Message.error(errorTips)
}
});
return errorTips
}
function successState(res) {
if (res.status === 200) {
return res.data
}
if (res.status === 401) {
MessageBox.alert('登陆信息已过期/账号在别的地方登陆了', '温馨提示', {
confirmButtonText: '确定',
callback: () => {
router.replace({name: '/login'})
store.dispatch('logout', '登录信息已经过期')
}
})
return '登录信息已经过期'
}
if (res.status === 403) {
router.push({path: '/forbid'})
return '没有操作权限'
}
if (res.data) {
return res.data
}
return '服务器发生未知错误'
}
const httpServer = (opts, data = {}, type = TYPE_BASE_URL, ...paramsIndex) => {
let URLBase = "";
let URLIndex = opts.url;
switch (type) {
case TYPE_BASE_URL:
URLBase = myapis.BASE_URL;
break;
case TYPE_BASE_STAT_URL:
URLBase = myapis.BASE_STAT_URL;
break;
case TYPE_BASE_SCORE_URL:
URLBase = myapis.BASE_SCORE_URL;
break;
case TYPE_BASE_AD_URL:
URLBase = myapis.BASE_AD_URL;
}
// 添加参数 这个是可能会将参数放在url内 例如 /user/12345 我就暂时想到了这个拼接
paramsIndex.forEach((it) => {
URLIndex += "/" + it;
})
let httpDefaultOpts = {
method: opts.method, // get 、post...
baseURL: URLBase, //base url
url: URLIndex,
timeout: 10000, //超时时间
// responseType: 'json',//如果设置成json,服务器不返回为json,responce为空
params: data, //数据
data: qs.stringify(data), // qs格式化数据
withCredentials: false, // 是否支持跨域
headers: opts.method === 'get' ? {
'Accept': 'application/json',
'Content-Type': 'application/json; charset=UTF-8'
} : {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
}
}
if (opts.method === 'get' && httpDefaultOpts.data) {
delete httpDefaultOpts.data
} else {
delete httpDefaultOpts.params
}
return new Promise(function (resolve, reject) {
axios(httpDefaultOpts).then(
res => {
if (typeof res === "undefined" || !res.status) {
reject(failState(null))
return;
}
if (errorCode.includes(res.status)) {
reject(failState(res))
} else {
resolve(successState(res))
}
}
).catch(
error => {
reject(errorState(error))
}
)
})
};
export default httpServer
复制代码
说在最后
这篇文章呢? 其实写的并不好 我自己封装的效果呢?其实也就一般般,感觉还有待优化的空间。我在这里摆出来是希望那些前端的大佬能给我写的代码有一些建议。如果有 小弟不胜感激:joy::joy::joy:。好了周末也差不多快结束了,出去吃饭了 出去ci饭了 好饿呀!!
以上所述就是小编给大家介绍的《我是这么使用axios的》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
RESTful Web Services Cookbook
Subbu Allamaraju / Yahoo Press / 2010-3-11 / USD 39.99
While the REST design philosophy has captured the imagination of web and enterprise developers alike, using this approach to develop real web services is no picnic. This cookbook includes more than 10......一起来看看 《RESTful Web Services Cookbook》 这本书的介绍吧!