axios
Axios — это промис-ориентированная HTTP-библиотека, которую можно использовать в браузерах и node.js, а также является http-библиотекой, официально рекомендованной vue; инкапсуляция axios, с одной стороны, удобна для дальнейшего обслуживания, а с другой — , он также может настроить обработку запросов
Установить
npm i axios
упаковка
I запрос axios, инкапсулированный в http.js, запрос на повторное получение, отправка пакета запроса
Сначала введем аксиомы
import axios from 'axios'
Установить префикс запроса интерфейса
Как правило, у нас будут среды разработки, тестирования и производства для разработки.Префиксы необходимо различать.Мы используем переменные среды узла для вынесения суждений.
if (process.env.NODE_ENV === 'development') {
axios.defaults.baseURL = 'http://dev.xxx.com'
} else if (process.env.NODE_ENV === 'production') {
axios.defaults.baseURL = 'http://prod.xxx.com'
}
При отладке на локальном хосте обычно возникают междоменные проблемы при прямом использовании адреса разработки, поэтому нам также необходимо настроить прокси
Этот проект создан с помощью vue cli3, а конфигурация прокси находится вvue.config.jsВ файле:
module.exports = {
devServer: {
proxy: {
'/proxyApi': {
target: 'http://dev.xxx.com',
changeOrigin: true,
pathRewrite: {
'/proxyApi': ''
}
}
}
}
}
Это будет успешно/proxyApiуказал на'http://dev.xxx.com', перезапустите службу
Измените конфигурацию в http.js
if (process.env.NODE_ENV === 'development') {
axios.defaults.baseURL = '/proxyApi'
} else if (process.env.NODE_ENV === 'production') {
axios.defaults.baseURL = 'http://prod.xxx.com'
}
перехватчик
Затем установите время ожидания и запросите информацию заголовка.
axios.defaults.timeout = 10000
// 请求头信息是为post请求设置
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
axios очень полезен, одним из которых является то, что его перехватчики очень мощные, мы можем устанавливать перехватчики для запросов и ответов, например, перехватчики запросов могут добавлять токены к каждому запросу, а также его удобно поддерживать после унифицированной обработки. перехватчик может выполнять ряд операций после получения ответа, таких как оценка статуса входа и авторизация в соответствии с кодом состояния.
// 请求拦截器
axios.interceptors.request.use(
config => {
// 每次发送请求之前判断是否存在token
// 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况,此处token一般是用户完成登录后储存到localstorage里的
token && (config.headers.Authorization = token)
return config
},
error => {
return Promise.error(error)
})
// 响应拦截器
axios.interceptors.response.use(response => {
// 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
// 否则的话抛出错误
if (response.status === 200) {
if (response.data.code === 511) {
// 未授权调取授权接口
} else if (response.data.code === 510) {
// 未登录跳转登录页
} else {
return Promise.resolve(response)
}
} else {
return Promise.reject(response)
}
}, error => {
// 我们可以在这里对异常状态作统一处理
if (error.response.status) {
// 处理请求失败的情况
// 对不同返回码对相应处理
return Promise.reject(error.response)
}
})
Получить пост пакет
httpGet: один параметр — это URL-адрес запроса, один — передаваемый параметр запроса, и возвращается объект обещания.
// get 请求
export function httpGet({
url,
params = {}
}) {
return new Promise((resolve, reject) => {
axios.get(url, {
params
}).then((res) => {
resolve(res.data)
}).catch(err => {
reject(err)
})
})
}
httpPost: Принцип аналогичен get.Следует отметить, что здесь есть дополнительный параметр данных.Перед отправкой почтового запроса необходимо выполнить над ним операцию с серийным номером.transformRequestВыполнить обработку, два других параметра url, params такие же, как и в запросе на получение;
// post请求
export function httpPost({
url,
data = {},
params = {}
}) {
return new Promise((resolve, reject) => {
axios({
url,
method: 'post',
transformRequest: [function (data) {
let ret = ''
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
}
return ret
}],
// 发送的数据
data,
// url参数
params
}).then(res => {
resolve(res.data)
})
})
}
как использовать
Я поместил все вызовы интерфейса в файл api.js
Сначала введите инкапсулированный метод, а затем повторно инкапсулируйте вызываемый интерфейс в метод для его предоставления.
import { httpGet, httpPost } from './http'
export const getorglist = (params = {}) => httpGet({ url: 'apps/api/org/list', params })
Вызов на странице:
// .vue
import { getorglist } from '@/assets/js/api'
getorglist({ id: 200 }).then(res => {
console.log(res)
})
Таким образом, API может управляться унифицированным образом, а обслуживание и модификация в будущем должны выполняться только в файле api.js.
полный код
Наконец, вставьте полный код
// http.js
import axios from 'axios'
// 环境的切换
if (process.env.NODE_ENV === 'development') {
axios.defaults.baseURL = '/proxyApi'
} else if (process.env.NODE_ENV === 'production') {
axios.defaults.baseURL = 'http://prod.xxx.com'
}
// 请求拦截器
axios.interceptors.request.use(
config => {
token && (config.headers.Authorization = token)
return config
},
error => {
return Promise.error(error)
})
axios.defaults.timeout = 10000
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
// 响应拦截器
axios.interceptors.response.use(response => {
if (response.status === 200) {
if (response.data.code === 511) {
// 未授权调取授权接口
} else if (response.data.code === 510) {
// 未登录跳转登录页
} else {
return Promise.resolve(response)
}
} else {
return Promise.reject(response)
}
}, error => {
// 我们可以在这里对异常状态作统一处理
if (error.response.status) {
// 处理请求失败的情况
// 对不同返回码对相应处理
return Promise.reject(error.response)
}
})
// get 请求
export function httpGet({
url,
params = {}
}) {
return new Promise((resolve, reject) => {
axios.get(url, {
params
}).then((res) => {
resolve(res.data)
}).catch(err => {
reject(err)
})
})
}
// post请求
export function httpPost({
url,
data = {},
params = {}
}) {
return new Promise((resolve, reject) => {
axios({
url,
method: 'post',
transformRequest: [function (data) {
let ret = ''
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
}
return ret
}],
// 发送的数据
data,
// url参数
params
}).then(res => {
resolve(res.data)
})
})
}
// api.js
import { httpGet, httpPost } from './http'
export const getorglist = (params = {}) => httpGet({ url: 'apps/api/org/list', params })
export const save = (data) => {
return httpPost({
url: 'apps/wechat/api/save_member',
data
})
}
// .vue
<script>
import { getorglist } from '@/assets/js/api'
export default {
name: 'upload-card',
data() {},
mounted() {
getorglist({ id: 200 }).then(res => {
// console.log(res)
})
},
}
</script>
=========================================================
Обновление 25 марта
Прежде всего, спасибо моим друзьям, которые помогли мне выступить. Я не ожидал, что у этой статьи будет столько прочтений. Это оказалась просто случайная заметка. Я думал, что ее никто не читает. Когда я увидел больше, чем 100 сообщений в выходные, я немного удивился.
В ответ на комментарии в области комментариев статья была обновлена и исправлена
Комментарии района сомневаются, почему многослойные пакеты обещают, а не напрямую возвращают аксиомы. Я здесь, чтобы быть единым описанием:
Конечно, вы можете вернуться напрямуюaxios.get().then(res=>res.data), написание более лаконичное; личные привычки программирования, чувствоresolve(res.data)Написание более элегантное, и это вопрос мнения, поэтому основной текст резервирует этот момент. Эта заметка также дает идею только для справки. Небольшие партнеры могут выбирать в соответствии со своими реальными потребностями бизнеса.
Мой клиент Xiaobai на этот раз также хочет зафиксировать использование axios.Если есть какие-либо несоответствия, я приветствую ваши комментарии (постарайтесь быть нежным), и я внесу коррективы и исправления, основанные на реальных потребностях бизнеса и мнениях каждого в будущее (постоянно).обновление~)