一.Axios介紹
axios是一個(gè)promise實(shí)現(xiàn)的http庫,符合最新的ES規(guī)范肝箱。要用這個(gè)東西主要有以下幾個(gè)原因:
(1) 從瀏覽器中創(chuàng)建 XMLHttpRequests
(2) 從 node.js 創(chuàng)建 http 請(qǐng)求
(3) 攔截請(qǐng)求和響應(yīng)
(4) 轉(zhuǎn)換請(qǐng)求數(shù)據(jù)和響應(yīng)數(shù)據(jù)
(5) 支持 Promise API(可以配合ES7的async await使用摧茴,解決回調(diào)地獄)
(6) 客戶端支持防止CSRF
(7) 提供了一些并發(fā)請(qǐng)求的接口
(8) 輕量绵载,體積小
二.使用步驟
在src文件夾下的common文件夾新建api文件夾,里面新建request.js文件
先導(dǎo)入axios和安裝qs包
qs是一個(gè)增加了一些安全性的查詢字符串解析和序列化字符串的庫。
1.在項(xiàng)目中使用命令行工具輸入:npm install qs
2.安裝完成后在需要用到的組件中:import qs from 'qs’
3.在main.js中全局引入: Vue.prototype.$qs = qs
4.轉(zhuǎn)換:qs.stringify(data)
1. request.js寫法
import axios from "axios";
//帶三方類庫
import qs from 'qs'
// 配置不同環(huán)境下娃豹,調(diào)用不同接口
switch(process.env.NODE_ENV){
// 生產(chǎn)環(huán)境焚虱,部署到服務(wù)器上的環(huán)境
case 'production':
axios.defaults.baseURL='http://api.zhengqinan.cn';
break;
//設(shè)置測(cè)式環(huán)境的接口地址
case 'text':
axios.defaults.baseURL='http://api.zhengqinantext.cn';
break;
//開發(fā)環(huán)境接口地址
default:
axios.defaults.baseURL='http://api.kaifa.cn'
}
/**
* 設(shè)置超時(shí)時(shí)間和跨域是否允許攜帶憑證
*/
axios.defaults.timeout=10000 //設(shè)置十秒
axios.defaults.withCredentials=true ;//例如:登錄校驗(yàn)session和cookie
/**
* 設(shè)置請(qǐng)求數(shù)據(jù)參數(shù)傳遞的格式,默認(rèn)是json格式懂版,但是在登錄校驗(yàn)中后臺(tái)一般設(shè)置請(qǐng)求格式:x-www-form-urlencoded(name=xxx,age=xxx)
* 看服務(wù)器要求什么格式
*/
axios.defaults.headers['Content-Type']='application/x-www-form-urlencoded' //聲明請(qǐng)求格式
axios.defaults.transformRequest=data=>qs.stringify(data) //qs是第三方庫鹃栽,轉(zhuǎn)換為x-www-form-urlencoded
/**
* 設(shè)置請(qǐng)求攔截器:----在項(xiàng)目中發(fā)請(qǐng)求(請(qǐng)求沒有發(fā)出去)可以做一些事情
* 客戶端->[請(qǐng)求攔截器]->服務(wù)器端
* token校驗(yàn)(JWT):接收到服務(wù)器的token,存儲(chǔ)到vuex/本地存儲(chǔ)中,每次向服務(wù)器發(fā)送請(qǐng)求定续,我們應(yīng)該把token帶上
* config :發(fā)起請(qǐng)求的請(qǐng)求配置項(xiàng)
*/
axios.interceptors.request.use(config=>{
let token=localStorage.getItem('token')
token && (config.headers.Authoriztion=token)
return config
},error=>{
return Promise.reject(error)
})
/**
* 設(shè)置響應(yīng)攔截器
* 服務(wù)器端返回信息->[響應(yīng)攔截器]->客戶端js獲取到信息
* response中包含屬性:
* data:相應(yīng)數(shù)據(jù),status:響應(yīng)狀態(tài)碼,statusText:響應(yīng)狀態(tài)信息,headers:響應(yīng)頭,config:響應(yīng)提供的配置信息,request
*/
axios.interceptors.response.use(response=>{
return response.data //將主體內(nèi)容返回 axios.get().then(result=>{拿到的就是響應(yīng)主體})
},error=>{
let { response}=error
// 如果有返回結(jié)果
if(response){
switch(response.status){
//這里面根據(jù)公司需求進(jìn)行寫
case 404:
//進(jìn)行錯(cuò)誤跳轉(zhuǎn)之類
break;
}
}else{
//服務(wù)器沒有返回結(jié)果 分兩種情況 斷網(wǎng) 服務(wù)器崩了
if(!window.navigator.onLine){
//斷網(wǎng)處理:跳轉(zhuǎn)到斷網(wǎng)頁面
return
}
return Promise.reject(error)
}
})
2.創(chuàng)建接口文件在api文件夾下新建文件夾login谍咆,再新建login.js文件
import axiosHttp from './request.js'
export const getuserinfor=(params)=>{
return axiosHttp({
method:'get',
url:'user/xxxx',
params
})
};
export const login=(data)=>{
return axiosHttp({
method:'post',
url:'login/xxxxx',
data,
})
}
3.使用
<template></template>
<script>
import { login } from "../api/login/login.js";
export default {
data() {
return {};
},
methods: {
async getlogin() {
let params = {
emile: 123,
name: "zhangsna",
};
let data = await login(params);
},
},
};
</script>
<style>
</style>