本章概要
在实际项目中,页面中所需要的数据通常是从服务端获取的,这必然牵涉与服务端的通信, Vue 官方推荐使用 axios 完成 Ajax 请求。 axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 Node.js 中。
15.1 安装
可以使用 CDN 方式安装 axios 。如下:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
如果采用模块化开发,则使用 npm 安装方式,执行以下命令来安装 axios。
npm install axios --save
或者使用 yarn 安装,执行以下命令:
yarn add axios --save
在 Vue 的脚手架项目中使用,可以将 axios 结合 vue-axios 插件一起使用,该插件只是将 axios 集成到 Vue.js 的轻度封装,本身不能独立使用。可以使用以下命令一起安装 axios 和 vue-axios。
npm install axios vue-axios
安装 vue-axios 插件后,使用形式如下:
import { createApp } from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
const app = createApp(App)
app.use(VueAxios,axios)
app.mount('#app')
之后在组件内就可以通过 this.axios 调用 axios 的方法发送请求。
15.2 基本用法
HTTP 最基本的请求就是 get 请求 和 post 请求。使用 axios 发送 get 请求调用形式如下:
axios.get('/book?id=1').then(function(response){
console.log(response)
}).catch(function (error){
console.log(error)
})
get() 方法就收一个 URL 作为参数,如果有要发送的数据,则以查询字符串的形式附加在 URL 后面。当服务端返回成功响应(状态码是2XX)时调用 then() 方法中的回调,可以在该回调函数中对服务端的响应进行处理;如果出现错误,则会调用 catch() 方法中的回调,可以在该回调函数中对错误信息进行处理,并向用户提示错误。
如果不喜欢 URL 后附加查询参数的写法,可以为 get() 方法传递一个配置对象作为参数,在配置对象中使用 params 字段指定要发送的数据。如下:
axios.get('/book',{
params:{ id:1 }
}).then(function(res){
console.log(res)
}).catch(function(err){
console.log(err)
})
可以使用 ES2017 的 async/await 执行异步请求。如下:
async function getBook(){
try {
const res = await axios.get('/book?id=1');
console.log(res)
}catch(err){
console.log(err)
}
}
post 请求是在请求体中发送数据,因此,axios 的 post() 方法多一个参数,该参数是一个对象,对象的属性就是要发送的数据。如下:
axios.post('/login',{
username:'lisi',
password:'1234'
}).then(function(res){
console.log(res)
}).catch(function(err){
console.log(err)
})
get() 和 post() 方法的原型如下:
get(url[,config])
post(url[,data[,config]])
接收到服务端的响应信息后,需要对响应信息进行处理。例如,设置用于组件渲染或更新所需要的数据。回调函数中的 response 是一个对象,该对象常用的属性是 data 和 status ,前者用于获取服务端返回的响应数据,后者是服务端发送的 HTTP 状态代码。response 对象的完整属性如下:
{
data:{},
status:200,
statusText:'OK',
headers:{},
config:{},
request:{}
}
成功响应后,获取数据的一般处理形式如下:
axios.get('/book?id=1').then(function(res){
if(res.status === 200){
this.book = res.data;
}
}).catch(function(err){
console.log(err)
})
如果出现错误,则会调用 catch() 方法中的回调,并向该回调函数传递一个错误对象。错误处理的一般形式如下:
axios.get('/book?id=1').catch(function(err){
if(err.res){
console.log(err.res.data);
console.log(err.res.status);
console.log(err.res.headers);
}else if(err.req){
console.log(err.req)
}else{
console.log('Error',err.message)
}
console.log(err.config)
})
15.3 axios API
可以通过想 axios 传递相关配置来创建请求。axios 原型如下:
axios(config)
axios(url[,config])
get 请求和 post 请求的调用形式如下:
axios('/book?id=1')
axios({
method:'get',
url:'/image/logo.png',
responseType:'stream'
}).then(function(res){
res.data.pipe(fs.createWriteStream('logo.png'))
})
axios({
method:'post',
url:'/login',
data:{
username:'lisi',
password:'1234'
}
})
为了方便使用,axios 库为所有支持的请求方法提供了别名。如下:
- axios.request(config)
- axios.get(url[,config])
- axios.delete(url[,config])
- axios.head(url[,config])
- axios.options(rul[,config])
- axios.post(url[,config])
- axios.put(url[,data[,config]])
- axios.patch(url[,data[,config]])
在使用别名方法时,url、method 和 data 这些属性都不必在配置对象中指定。
15.4 请求配置
axios 库为请求提供了配置对象,在该对象中可以设置很多选项,常用的是 url、method、headers 和 params。完整的选项如下:
{
url:'/book',
method:'get',
baseURL:'https://some-domain.com/api/',
transformRequest:[function(data,headers){
return data;
}],
transformResponse:[function(data){
return data;
}],
headers:{'X-Request-With':'XMLHttpRequest'},
params:{
ID:1
},
paramsSerializer : function(params){
return Qs.stringify(params,{arrayFormat:'brackets'})
},
data:{
firstName:'Fred'
},
data:'Country=Brasil&City=Belo Horizonte',
timeout:1000,
withCredentials:false,
adapter:function(config){
},
auth:{
username:'zhangsan',
password:'123'
},
responseType:'json',
responseEncoding:'utf8',
xsrfCookieName:'XSRF-TOKEN',
onUploadProgress:function(progressEvent){
},
onUploadProgress:function(progressEvent){
},
maxContentLength:2000,
maxBodyLength:2000,
validateStatus:function(status){
return status >= 200 && status < 300;
},
maxRedirects:5,
socketPath:null,
httpAgent:new http.Agent({keepAlive:true}),
httpsAgent:new https.Agent({keepAlive:true}),
proxy:{
host:'127.0.0.1',
port:9000,
auth:{
username:'aa',
password:'bb'
}
},
cancelToken:new CancelToken(function(cancel){
})
decompress:true
}
15.5 并发请求
有时需要向服务器发起多个请求,这可以用 Promise.all 实现。 例如:
function getUserAccount(){
return axios.get('/user/12345');
}
function getUserPermissions(){
return axios.get('/user/12345/permissioins');
}
Promise.all([getUserAccount(),getUserPermissions()]).then(function (results)){
const acct = results[0];
const perm = results[1];
}
|