axiosЭто библиотека, которая очень часто используется во фронтенд-разработке. Он работает как в браузере, так и в бэкэнд-проектах Node.js. Эта статья в основном объединяет мои собственные проекты разработки, чтобы рассказать о некоторых распространенных случаях использования аксиом в браузерах.
Основное использование
В процессе разработки проекта вы можетеaxios.create
Создайте экземпляр, выполните некоторую настройку экземпляра и получите функцию ajax, предназначенную для связи с внутренним сервером.
const instance = axios.create()
Вот некоторые конфигурации для этого экземпляра:
baseURL
В формальной среде или среде разработки настройтеbaseURL
Это позволяет нам легко устанавливать правила переадресации маршрутизации.
const instance = axios.create({
baseURL: '/api/'
})
header
В одностраничном приложении задайте некоторую информацию в заголовке запроса, например поместите токен в заголовок запроса.
// 继续对刚刚创建的示例进行配置
instance.defaults.headers.common['x-auth-token'] = 'some token'
interceptors
Запросы и ответы обрабатываются путем настройки перехватчиков.
Предположим, что возвращаемое значение с этого сервера имеет следующую структуру:
{
code: 200,
data: Object,
msg: ''
}
Там, где данные — это информация, которая нам действительно нужна, добавьте перехватчик ответа для обработки и извлечения данных из него. Проверив значение кода, определите, соответствует ли значение ответа требованиям. Когда он не соответствует требованиям, возвращается только сообщение об ошибке, и ошибка может быть обработана в функции обратного вызова позже.
// 处理响应成功
// axios 会对响应的结果进行一层封装,直接取data
instance.interceptors.response.use(({data}) => {
if (data.code === 200) {
return data.data
} else {
console.error(res)
// 假设这里有一个 Toast 组件
Toast(res.msg)
return Promise.reject({
msg: msg
})
}
})
использование параметров
Иногда вызывайте интерфейс со многими условиями запроса, используйтеaxios.get
При переходе в содержащееparmas
Объекты полей - самый удобный способ.
let params = {
keyWord: null,
name: 'xxx',
age: 22
}
// 为 null 的属性都会被过滤掉,最终的请求 url 是 /person?name=xxx&age=22
instance.get('/person', { params })
Загрузить файл в пример Qiniu
надinstance
Он используется для связи с серверной частью. Теперь загрузите файл в Qiniu и используйте axios, чтобы загрузить его напрямую. согласно сДокументация разработчика Qiniu, отправьте объект FormData на сервер Qiniu. Этот объект FormData должен содержать токен и файл.
// 假设这里有一个 input 框: <input id="input" type="file" />
const file = document.getElementById('input').files[0]
const formData = new FormData()
formData.append('token', token) // token 由服务器端生成
formData.append('file', file)
axios.post('http://upload.qiniu.com/', formData).then(({ data }) => {
console.log(data) // 返回值
})
Для операции загрузки файлов требуется много времени.Прослушивая событие progress, вы можете получить информацию о ходе загрузки. Код для загрузки файла нуждается в некоторой настройке.
axios.post('http://upload.qiniu.com/', {
data: formData,
onUploadProgress: (e) => {
const percentComplete = e.loaded / e.total // 上传的进度
}
}).then(({ data }) => {
console.log(data) // 返回值
})
В некоторых сценариях вам необходимо загрузить изображение в кодировке base64. согласно сЦинью загрузить файл, при загрузке установить заголовок запросаContent-Type
а такжеAuthorization
, поместите изображение в кодировке base64 в тело пакета запроса. Код здесь нуждается в некоторой настройке.
axios({
method: 'post',
url: 'https://upload.qiniup.com/putb64/-1',
headers: {
'Content-Type': 'application/octet-stream',
Authorization: `UpToken ${token}`
},
data: imgSrc.split('base64,')[1] // 直接传递内容
})
Совместно с государственной библиотекой управления
В одном веб-приложении информация о токене пользователя сохраняется в Магазине. Когда пользователь входит в систему или когда срок действия токена истекает, некоторые параметры экземпляра AXIOS необходимо динамически изменять.
Предположим, что библиотека управления состоянием, которую мы здесь используем, называется Redux.
В перехватчике определите, истек ли срок действия токена.
instance.interceptors.response.use(({data}) => {
if (data.code === 200) {
return data.data
} else if (data.code === 40001){ // code: 40001 表示 token 过期
store.commit(CLEAR_TOKEN)
}
...
})
При изменении хранилища динамически меняйте информацию о маркере, передаваемую серверной части.
store.subscrible(() => {
instance.defaults.headers.common['token'] = store.getState().token
})
Используйте с Vue
В проекте многие компоненты должны импортировать библиотеку axios. Если в проекте используется Vue, зарегистрируйте экземпляр axios как подключаемый модуль Vue, чтобы избежать повторного повторного импорта. Зарегистрируйтесь, добавив метод экземпляра VueVue-плагинВот и все.
// http.js 创建 instance
// 导出一个包含 install 函数的对象
export default {
install (Vue) {
Vue.prototype.$http = instance
}
}
// main.js
Vue.use(http) // 在 Vue 组件中 this.$http 就可以发起请求了