Axios请求
-
含义
- 基于promise网络请求库,作用于node.js 和浏览器
- 在服务端它使用原生 node.js
http模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests
-
GET请求
-
写法一
axios.get('/user?ID=12345') .then(function (response) { // 处理成功情况 console.log(response); }) .catch(function (error) { // 处理错误情况 console.log(error); }) .finally(function () { // 总是会执行 }); -
写法二
axios.get('/user', { params: { ID: 12345 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }) .finally(function () { // 总是会执行 }); -
写法三(async/await写法,IE和旧浏览器不支持)
async function getUser() { try { const response = await axios.get('/user?ID=12345'); console.log(response); } catch (error) { console.error(error); } }
-
-
POST请求
-
例子
axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }) .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'); } const [acct, perm] = await Promise.all([getUserAccount(), getUserPermissions()]);
-
-
axios API
-
axios(config)
-
GET请求
axios({ method: 'get', url: 'http://bit.ly/2mTM3nY', responseType: 'stream' }) .then(function (response) { response.data.pipe(fs.createWriteStream('ada_lovelace.jpg')) }); -
POST请求
axios({ method: 'get', url: 'http://bit.ly/2mTM3nY', responseType: 'stream' }) .then(function (response) { response.data.pipe(fs.createWriteStream('ada_lovelace.jpg')) });
-
-
axios(url,[config])
// 默认发送一个GET请求 axios('/user/12345');
-
-
axios新建实例
const instance = axios.create({ baseURL: 'https://some-domain.com/api/', timeout: 1000, headers: {'X-Custom-Header': 'foobar'} }); -
请求配置
-
url
- 请求的服务器url(必需)
-
method
- 请求时使用的方法
-
baseURL
- 自动加在
url前面,除非url是一个绝对 URL
- 自动加在
-
transformRequest
- 可以在向服务器发送前修改数据,只能用于PUT、POST、PATCH,返回一个字符串、Buffer实例、ArrayBuffer、FormData、Stream
transformRequest: [function (data, headers) { // 对发送的 data 进行任意转换处理 return data; }], -
transformResponse
- 在传递给then/catch前修改响应数据
transformResponse: [function (data) { // 对接收的 data 进行任意转换处理 return data; }], -
headers:{‘xx’:'xxx'}
- 自定义请求头
-
params:{xx:xx}
- 与请求一起发送的URL参数,必须是简单对象/URLSearchParams参数
-
paramsSerializer
- 用于序列化
params
paramsSerializer: function (params) { return Qs.stringify(params, {arrayFormat: 'brackets'}) }, - 用于序列化
-
data:{xx:xx}
- 作为请求体被发送的数据
-
data: 'Country=Brasil&City=Belo Horizonte'
- 发送请求体数据的可选语法
- 请求方式 post
- 只有 value 会被发送,key 则不会
-
timeout
- 指定请求超时的毫秒数
-
withCredentials:false(默认)
- 跨域请求时是否需要使用凭证
-
adapter
-
自定义处理请求
-
返回一个 promise 并提供一个有效的响应
adapter: function (config) { /* ... */ },
-
-
auth
-
HTTP Basic Auth
auth: { username: 'janedoe', password: 's00pers3cret' },
-
-
responseType:'json'(默认)
- 浏览器将要响应的数据类型
- 选项包括: 'arraybuffer', 'document', 'json', 'text', 'stream'
- 浏览器专属:'blob'
-
responseEncoding: 'utf8'(默认)
- 表示用于解码响应的编码
-
xsrfCookieName: 'XSRF-TOKEN'(默认值)
-
xsrf token 的值,被用作 cookie 的名称
-
xsrfHeaderName: 'X-XSRF-TOKEN'(默认值)
- 带有 xsrf token 值的http 请求头名称
-
onUploadProgress
-
允许为上传处理进度事件
-
浏览器专属
onUploadProgress: function (progressEvent) { // 处理原生进度事件 },
-
-
onDownloadProgress
-
允许为下载处理进度事件
-
浏览器专属
onDownloadProgress: function (progressEvent) { // 处理原生进度事件 },
-
-
maxContentLength
- node.js中允许的HTTP响应内容的最大字节数
-
maxBodyLength
- (仅Node)定义允许的http请求内容的最大字节数
-
validateStatus
-
定义了对于给定的 HTTP状态码是 resolve 还是 reject promise。
-
如果
validateStatus返回true(或者设置为null或undefined),则promise 将会 resolved,否则是 rejected。validateStatus: function (status) { return status >= 200 && status < 300; // 默认值 },
-
-
maxRedirects:5(默认)
- 定义了在node.js中要遵循的最大重定向数。
- 如果设置为0,则不会进行重定向
-
socketPath:null(默认)
- 定义了在node.js中使用的UNIX套接字。e.g. '/var/run/docker.sock' 发送请求到 docker 守护进程。
- 只能指定
socketPath或proxy。若都指定,这使用socketPath。
-
httpAgent和httpsAgent
-
分别定义了在 node.js 中执行 http 和 https 请求时要使用的自定义代理。这允许添加诸如
keepAlive之类的默认未启用的选项。httpAgent: new http.Agent({ keepAlive: true }), httpsAgent: new https.Agent({ keepAlive: true }),
-
-
proxy
-
定义了代理服务器的主机名,端口和协议
proxy: { protocol: 'https', host: '127.0.0.1', port: 9000, auth: { username: 'mikeymike', password: 'rapunz3l' } },
-
-
decompress:true(默认)
- 表示响应体是否应自动解压缩
- 如果设置为
true,还将从所有解压缩响应的响应对象中删除 'content-encoding' 标头 - 仅适用于节点(XHR 无法关闭解压缩)
-
-
拦截器:在请求或响应被 then 或 catch 处理前拦截它们
-
请求拦截器
axios.interceptors.request.use(function (config) { // 在发送请求之前做些什么 return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); -
响应拦截器
axios.interceptors.response.use(function (response) { // 2xx 范围内的状态码都会触发该函数。 // 对响应数据做点什么 return response; }, function (error) { // 超出 2xx 范围的状态码都会触发该函数。 // 对响应错误做点什么 return Promise.reject(error); }); -
移除拦截器
const myInterceptor = axios.interceptors.request.use(function () {/*...*/}); axios.interceptors.request.eject(myInterceptor);
-
-
错误处理
-
使用配置选项validateStatus
axios.get('/user/12345', { validateStatus: function (status) { return status < 500; // 处理状态码小于500的情况 } }) -
使用toJSON
axios.get('/user/12345') .catch(function (error) { console.log(error.toJSON()); });
-
-
取消请求
-
AbortController (中止控制器)
const controller = new AbortController(); axios.get('/foo/bar', { signal: controller.signal }).then(function(response) { //... }); // 取消请求 controller.abort() -
取消令牌
const CancelToken = axios.CancelToken; const source = CancelToken.source(); axios.get('/user/12345', { cancelToken: source.token }).catch(function (thrown) { if (axios.isCancel(thrown)) { console.log('Request canceled', thrown.message); } else { // 处理错误 } }); axios.post('/user/12345', { name: 'new name' }, { cancelToken: source.token }) // 取消请求(message 参数是可选的) source.cancel('Operation canceled by the user.'); // OR const CancelToken = axios.CancelToken; let cancel; axios.get('/user/12345', { cancelToken: new CancelToken(function executor(c) { // executor 函数接收一个 cancel 函数作为参数 cancel = c; }) }); // 取消请求 cancel();
-
-
应用
-
结合element中loading和message组件
let loadinginstace axios.interceptors.request.use(config => { // 开启loading loadinginstace = Loading.service({ fullscreen: true }) return config }, error => { loadinginstace.close() Message.error({ message: '加载超时' }) return Promise.reject(error) }) // 响应拦截器 axios.interceptors.response.use(data => { // 响应成功关闭loading loadinginstace.close() return data }, error => { loadinginstace.close() Message.error({ message: '加载失败' }) return Promise.reject(error) }) -
登录权限控制
const router = new Router({ routes: [ { path: '/background', name: 'background', // 需要登录才能进入的页面可以增加一个meta属性 meta: { requireAuth: true }, // 按需加载 component: (resolve) => { require(['../components/background'], resolve) } } ] }) // 判断是否需要登录权限 以及是否登录 router.beforeEach((to, from, next) => { if (to.matched.some(res => res.meta.requireAuth)) {// 判断是否需要登录权限 if (localStorage.getItem('username')) {// 判断是否登录 next() } else {// 没登录则跳转到登录界面 next({ path: '/Register', query: {redirect: to.fullPath} }) } } else { next() } })
-