1. Axios简介
Axios是一个现代化的开源JavaScript库,被广泛地应用于各种前端项目中。它最主要的作用是在浏览器和Node.js中创建RESTful API请求,提供了一个统一的API,可以在任何一个环境下使用同样的方式去发起HTTP请求。Axios的优势在于其请求的稳定性、易用性、灵活性等等。
而Vue.js,则是一款轻量级的前端框架,结合了模板语法和响应式数据机制,使得我们可以更快捷地开发web应用。Vue.js在数据绑定和UI组件上的表现非常优秀,同时也支持服务端渲染。
下面,我们将会在Vue.js框架中使用Axios库完成常见的数据请求操作。
2. 安装Axios
在使用Axios之前,需要先将其安装到项目中。可通过npm命令进行安装:
npm install axios
3. 发送GET请求
发送GET请求是最为常见的一种RESTful API请求。发送GET请求的方法十分简单,只需要通过get()方法即可发送一个带有query参数的GET请求,如下所示:
axios.get('https://jsonplaceholder.typicode.com/posts', {
params: {
userId: 1,
_sort: 'id',
_order: 'desc'
}
}).then(response => {
console.log(response.data)
}).catch(error => {
console.error(error)
})
在这个例子中,我们通过Axios发送了一个GET请求至 jsonplaceholder API。同时,我们也向该请求添加了一些query参数,即userId、_sort和_order。Axios的get()方法是基于Promise之上的,因此可以使用then()方法和catch()方法进行数据处理和错误处理。
3.1 避免缓存
有时候我们发送的GET请求会被有些浏览器进行缓存,这样就会导致我们获取到的数据不会是最新的。这个时候,我们可以配置Axios的请求头,让浏览器不会对请求进行缓存。这可以通过添加一个名为“Cache-Control”的请求头达到:
axios.get('https://jsonplaceholder.typicode.com/posts', {
params: {
userId: 1,
_sort: 'id',
_order: 'desc'
},
headers: {
'Cache-Control': 'no-cache'
}
}).then(response => {
console.log(response.data)
}).catch(error => {
console.error(error)
})
可以注意到,在上面的例子中,我们额外添加了一个headers对象,其中包含了一个名为“Cache-Control”的属性。这个属性的值是“no-cache”,它告诉浏览器不对请求进行缓存,这样我们就可以获得最新的数据。
4. 发送POST请求
发送POST请求的操作也十分简单,并且与发送GET请求的方法有些相似。不同之处就在于,我们需要为post()方法提供第二个参数,以便我们可以将数据作为请求体进行提交。
axios.post('https://jsonplaceholder.typicode.com/posts', {
title: 'foo',
body: 'bar',
userId: 1
}).then(response => {
console.log(response.data)
}).catch(error => {
console.error(error)
})
在这个例子中,我们可以向jsonplaceholder API发送一个带有数据体的POST请求,以创建一个新的数据项。
4.1 请求头和响应头
一般情况下,我们会需要在请求头和响应头中添加一些额外的信息。比如,我们可能会需要在请求头中添加Token值并进行身份验证。同样的,在响应头中,我们也需要了解一些类似“Content-Type”的头信息,以便知道服务端返回的数据类型。
对于这些需求,Axios同样能够很好地支持。我们可以通过配置请求头和响应头,来满足我们的需要。在上面的例子中,我们已经看到过如何修改请求头,那么下面我们来看一下如何修改响应头:
axios.get('https://jsonplaceholder.typicode.com/photos/1', {
responseType: 'arraybuffer'
}).then(response => {
const base64 = btoa(
new Uint8Array(response.data)
.reduce((data, byte) => data + String.fromCharCode(byte), '')
)
console.log(`data:image/jpeg;base64,${base64}`)
}).catch(error => {
console.error(error)
})
在这个例子中,我们向jsonplaceholder API发送了一次GET请求,同时也查询了一个参数为1的特定数据项。通过设置responseType属性,我们告诉Axios返回一个arraybuffer对象。在响应处理过程中,我们将其转换为了一个base64编码的字符串,以便后续的处理。
5. 发送PUT请求和DELETE请求
发送PUT请求和发送DELETE请求也是常用的RESTful API请求操作。对于这类请求,Axios也能很好地支持。发送PUT请求需要提供更多的参数,并且需要将数据发送到特定的服务端URL中。
axios.put('https://jsonplaceholder.typicode.com/posts/1', {
id: 1,
title: 'foo',
body: 'bar',
userId: 1
}).then(response => {
console.log(response.data)
}).catch(error => {
console.error(error)
})
与发送PUT请求不同,发送DELETE请求只需要提供要删除的数据项的URL即可:
axios.delete('https://jsonplaceholder.typicode.com/posts/1')
.then(response => {
console.log(response.data)
}).catch(error => {
console.error(error)
})
6. 异常处理
在真实的应用中,很有可能我们会遇到一些请求异常的情况。Axios在这方面的支持非常全面,提供了很多种不同的处理方式。首先,Axios会在发生一系列异常情况时抛出Error对象。我们可以通过try…catch语句来处理这个异常,以确保应用能够在错误发生后保持正常的运行状态。
try {
const response = await axios.get('https://jsonplaceholder.typicode.com/posts')
console.log(response.data)
} catch (error) {
console.error(error)
}
在上面的例子中,我们使用了try-catch语句来包装GET请求。如果请求失败,就会被catch块捕获,并输出错误信息。
6.1 网络异常
有时候,网络异常会成为我们遇到的最常见的问题之一。为了处理相关问题,Axios提供了一个error.response对象。通过这个对象,我们可以获取到所有关于请求异常的信息。并且,Axios有很多方式来处理这种异常情况。
axios.get('https://jsonplaceholder.typicode.com/404')
.then(response => {
console.log(response.data)
}).catch(error => {
if (error.response) {
console.log(error.response.status)
console.log(error.response.headers)
console.log(error.response.data)
} else if (error.request) {
console.error(error.request)
} else {
console.error('Error', error.message)
}
})
在上面的例子中,我们人为地访问了一个不存在的URL,将Axios请求的response自然处理一下就可以看到完整的响应信息了。
7. Axios拦截器
Axios还提供了一个拦截器的机制。拦截器可以帮助我们在请求和响应中加入某些信息以及处理一些异常情况。在Vue.js应用中,我们可以使用拦截器来处理HTTP请求和响应,以及对应的错误。
7.1 请求拦截器
请求拦截器可以允许我们在请求发送至服务器之前对其进行操作或者做一些额外的操作。例如,在各种get和post请求中,我们需要添加请求头或者query参数。可以通过下面的代码示例来定义一个请求拦截器:
axios.interceptors.request.use((config) => {
config.headers.Authorization = `Token ${localStorage.getItem('token')}`
return config
}, (error) => {
return Promise.reject(error)
})
在上面的例子中,我们在请求拦截器中添加了一个Token值,然后将Token塞到了请求头中。通过这种方式,我们可以保证每次向服务器发送请求都会携带一个Token值。
7.2 响应拦截器
响应拦截器允许我们对返回的响应数据进行操作。例如,在某个响应中包含了错误信息的情况下,我们可以通过一个响应拦截器来统一地处理错误并报告给用户。请查看下面的代码示例:
axios.interceptors.response.use((response) => {
if (response.headers['content-type'] === 'application/json') {
const data = response.data
if (typeof data === 'object' && data.status === 'error') {
return Promise.reject(data)
}
}
return response
}, (error) => {
console.log(error)
if (error.response && error.response.status === 401) {
console.log('Unauthenticated!')
}
return Promise.reject(error)
})
在上面的例子中,我们添加了一个响应拦截器来处理从服务器返回的数据。如果返回的响应中包含了错误信息,那么我们就将promise对象转换为rejected状态。在轻松处理这些请求的同时,我们也可以避免在处理上出现同样的错误。
8. 总结
Axios 非常适合开发现代 Web 应用,因为它提供了非常现代化的 API,并使用 Promise 和异步函数来管理模块之间的依赖关系。
在 Vue.js 中,Axios 可以与 Vuex 数据存储层集成。Axios 使 Vuex 能够更好地处理的异步操作并让它们发挥最佳性能。
当然,Axios有更多的应用场景,不仅限于此。感兴趣的读者,可以到Axios的官网查看更多的说明文档。