vue 에서 Axios 의 패 키 징 과 API 인터페이스 관리 에 대한 상세 한 설명
그림 처럼 엉망 코드 를 마주 한 당신~~~정말 말 하고 싶 어 요,What F~U~C~K!!!
본론 으로 돌아 가면 우리 가 말 하고 자 하 는 axios 의 패 키 징 과 api 인터페이스의 통일 적 인 관 리 는 코드 를 간소화 하고 후기 업데이트 유지 에 유리 하도록 하 는 데 목적 을 둔다.
1.axios 의 패키지
vue 프로젝트 에서 배경 과 상호작용 하여 데 이 터 를 가 져 옵 니 다.우 리 는 보통 axios 라 이브 러 리 를 사용 합 니 다.promise 기반 http 라 이브 러 리 로 브 라 우 저 와 node.js 에서 실행 할 수 있 습 니 다.그 는 차단 요청 과 응답,취소 요청,제 이 슨 전환,클 라 이언 트 방어 XSRF 등 우수한 특성 을 가지 고 있다.그래서 우리 의 유 대 는 공식 라 이브 러 리 vue-resource 에 대한 유 지 를 과감하게 포기 하고 axios 라 이브 러 리 를 사용 하 는 것 을 추천 합 니 다.axios 에 대해 잘 모 르 는 것 은 걸음 을 옮 길 수 있 습 니 다axios 문서
설치 하 다.
npm install axios; // axios
끌어들이다보통 프로젝트 의 src 디 렉 터 리 에 request 폴 더 를 새로 만 든 다음 http.js 와 api.js 파일 을 새로 만 듭 니 다.http.js 파일 은 우리 의 axios,api.js 를 봉인 하여 우리 의 인 터 페 이 스 를 통일 적 으로 관리 하 는 데 사 용 됩 니 다.
// http.js axios
import axios from 'axios'; // axios
import QS from 'qs'; // qs , post ,
// vant toast , ui 。
import { Toast } from 'vant';
환경의 전환우리 의 프로젝트 환경 은 개발 환경,테스트 환경 과 생산 환경 이 있 을 수 있다.우 리 는 node 의 환경 변 수 를 통 해 기본 인터페이스 url 접두사 와 일치 합 니 다.axios.defaults.baseURL 은 axios 의 기본 요청 주 소 를 설정 할 수 있 습 니 다.
//
if (process.env.NODE_ENV == 'development') {
axios.defaults.baseURL = 'https://www.baidu.com';}
else if (process.env.NODE_ENV == 'debug') {
axios.defaults.baseURL = 'https://www.ceshi.com';
}
else if (process.env.NODE_ENV == 'production') {
axios.defaults.baseURL = 'https://www.production.com';
}
설정 요청 시간 초과axios.defaults.timeout 을 통 해 기본 요청 시간 초과 설정 합 니 다.예 를 들 어 10s 를 초과 하면 사용자 에 게 현재 요청 시간 초과,새로 고침 등 을 알려 줍 니 다.
axios.defaults.timeout = 10000;
post 요청 헤더 의 설정 post 요청 을 할 때 요청 헤 더 를 추가 해 야 하기 때문에 여기에서 기본 설정 을 할 수 있 습 니 다.즉,post 요청 헤 더 를 application/x-ww-form-urlencoded 로 설정 할 수 있 습 니 다.charset=UTF-8
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
차단 요청우 리 는 요청 을 보 내기 전에 요청 을 차단 할 수 있 습 니 다.왜 차단 해 야 합 니까?우리 가 요청 을 차단 하 는 것 은 무엇 을 하 는 것 입 니까?예 를 들 어 일부 요청 은 사용자 가 로그 인 한 후에 만 접근 할 수 있 거나 post 요청 을 할 때 우리 가 제출 한 데 이 터 를 직렬 화 해 야 합 니 다.이 럴 때,우 리 는 요청 이 발송 되 기 전에 차단 을 해서 우리 가 원 하 는 조작 을 할 수 있다.
차단 을 요청 하 다
// vuex,
// vuex
import store from '@/store/index';
// axios.interceptors.request.use(
config => {
// vuex token
// , http header token, token
// token, token ,
const token = store.state.token;
token && (config.headers.Authorization = token);
return config;
},
error => {
return Promise.error(error);
})
여기 서 token 은 로그 인 이 끝 난 후에 사용자 의 token 을 localstorage 나 쿠키 를 통 해 로 컬 에 존재 합 니 다.그리고 사용자 가 페이지 에 들 어 갈 때마다(즉,main.js 에서)로 컬 저장 소 에서 token 을 먼저 읽 습 니 다.token 에 로그 인 했다 는 설명 이 있 으 면 vuex 의 token 상 태 를 업데이트 합 니 다.그리고 인 터 페 이 스 를 요청 할 때마다 요청 한 header 에 token 을 휴대 합 니 다.백 스테이지 직원 들 은 당신 이 가지 고 있 는 token 에 따라 로그 인 이 만 료 되 었 는 지 여 부 를 판단 할 수 있 습 니 다.가지 고 있 지 않 으 면 로그 인 한 적 이 없다 는 것 을 설명 합 니 다.이 럴 때 일부 동료 들 은 의문 이 생 길 수 있 습 니 다.모든 요청 이 token 을 가지 고 있 습 니 다.만약 에 한 페이지 가 사용자 로그 인 이 필요 하지 않 으 면 방문 할 수 있 습 니 다.어떻게 해 야 합 니까?사실,당신 의 전단 요청 은 token 을 휴대 할 수 있 지만,백 엔 드 는 받 지 않 는 것 을 선택 할 수 있 습 니 다!응답의 차단
//
axios.interceptors.response.use(
response => {
// 200, ,
//
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 2
//
// , ,
// ,
error => {
if (error.response.status) {
switch (error.response.status) {
// 401:
// ,
// , 。
case 401:
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
break;
// 403 token
//
// token vuex token
//
case 403:
Toast({
message: ' , ',
duration: 1000,
forbidClick: true
});
// token
localStorage.removeItem('token');
store.commit('loginSuccess', null);
// , fullPath ,
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404
case 404:
Toast({
message: ' ',
duration: 1500,
forbidClick: true
});
break;
// ,
default:
Toast({
message: error.response.data.message,
duration: 1500,
forbidClick: true
});
}
return Promise.reject(error.response);
}
}
});
응답 차단 기 는 서버 가 우리 에 게 돌아 온 데 이 터 를 잘 이해 합 니 다.우 리 는 받 기 전에 그 를 처리 할 수 있 습 니 다.예 를 들 어 위의 사상:배경 에서 돌아 오 는 상태 코드 가 200 이면 데 이 터 를 정상적으로 되 돌려 줍 니 다.그렇지 않 으 면 잘못된 상태 코드 유형 에 따라 우리 가 필요 로 하 는 오 류 를 진행 합 니 다.사실은 여 기 는 잘못된 통일 처리 와 로그 인 하지 않 거나 로그 인 기한 이 지난 후에 로그 인 페이지 를 조정 하 는 작업 입 니 다.주의해 야 할 것 은 위의 Toast()방법 입 니 다.제 가 도입 한 vant 라 이브 러 리 의 toast 경 알림 구성 요소 입 니 다.ui 라 이브 러 리 에 따라 알림 구성 요 소 를 사용 하 십시오.
패키지 get 방법 및 post 방법
우리 가 자주 사용 하 는 ajax 요청 방법 은 get,post,put 등 방법 이 있 으 며,어린 친구 들 이 낯 설 지 않 을 것 이 라 고 믿 습 니 다.axios 에 대응 하 는 것 도 비슷 한 방법 이 많 습 니 다.잘 모 르 겠 으 면 문 서 를 볼 수 있 습 니 다.그러나 우리 의 코드 를 간소화 하기 위해 서 우 리 는 그것 에 대해 간단 한 포장 을 해 야 한다.다음 에 우 리 는 주로 두 가지 방법 을 봉인 한다.get 과 post.
get 방법:우 리 는 get 함 수 를 정의 합 니 다.get 함 수 는 두 개의 매개 변수 가 있 습 니 다.첫 번 째 매개 변 수 는 우리 가 요청 할 url 주 소 를 표시 하고 두 번 째 매개 변 수 는 우리 가 휴대 해 야 할 요청 매개 변수 입 니 다.get 함수 가 promise 대상 을 되 돌려 줍 니 다.axios 가 요청 에 성 공 했 을 때 resolve 서버 가 값 을 되 돌려 주 고 요청 에 실 패 했 을 때 reject 오류 값 을 되 돌려 줍 니 다.마지막 으로 export 를 통 해 get 함 수 를 던 집 니 다.
/**
* get , get
* @param {String} url [ url ]
* @param {Object} params [ ]
*/
export function get(url, params){
return new Promise((resolve, reject) =>{
axios.get(url, {
params: params
}).then(res => {
resolve(res.data);
}).catch(err =>{
reject(err.data)
})
});}
post 방법:원 리 는 get 과 기본적으로 같 지만 주의해 야 할 것 은 post 방법 은 제출 된 매개 변수 대상 을 직렬 화 하 는 작업 을 사용 해 야 하기 때문에 node 의 qs 모듈 을 통 해 우리 의 매개 변 수 를 직렬 화 합 니 다.이것 은 매우 중요 합 니 다.직렬 화 작업 이 없 으 면 배경 에서 제출 한 데 이 터 를 가 져 올 수 없습니다.이것 이 바로 글 의 시작 부분 입 니 다.우리 import QS from'qs';원인직렬 화가 무슨 뜻 인지 모 르 겠 으 면 바 이 두 를 보 세 요.답 이 많 습 니 다.
/**
* post , post
* @param {String} url [ url ]
* @param {Object} params [ ]
*/
export function post(url, params) {
return new Promise((resolve, reject) => {
axios.post(url, QS.stringify(params))
.then(res => {
resolve(res.data);
})
.catch(err =>{
reject(err.data)
})
});
}
여기에 작은 세부 사항 이 있 습 니 다.axios.get()방법 과 axios.post()가 데 이 터 를 제출 할 때 매개 변수의 쓰기 방식 은 차이 가 있 습 니 다.차이 점 은 get 의 두 번 째 매개 변 수 는{}이 고 이 대상 의 params 속성 값 은 매개 변수 대상 입 니 다.post 의 두 번 째 매개 변 수 는 매개 변수 대상 입 니 다.둘 의 약간의 차 이 는 주의해 야 한다!axios 의 패 키 징 은 기본적으로 완성 되 었 습 니 다.다음은 api 의 통일 관 리 를 간단하게 말씀 드 리 겠 습 니 다.
가지런 한 api 는 회로 기 판 처럼 아무리 복잡 해도 전체 노선 을 선명 하 게 할 수 있다.위 에서 말 했 듯 이,우 리 는 api.js 를 새로 만 들 고,이 파일 에 우리 의 모든 api 인 터 페 이 스 를 저장 할 것 이다.
우선 api.js 에 포 장 된 get 과 post 방법 을 도입 합 니 다.
/**
* api
*/
import { get, post } from './http'
현재,예 를 들 어 우 리 는 이러한 인터페이스 가 있 습 니 다.post 요청 입 니 다.
http://www.baiodu.com/api/v1/users/my_address/address_edit_before
우 리 는 api.js 에서 이렇게 봉인 할 수 있다.
export const apiAddress = p => post('api/v1/users/my_address/address_edit_before', p);
우 리 는 api Address 방법 을 정 의 했 습 니 다.이 방법 은 인자 p 가 있 습 니 다.p 는 우리 가 인 터 페 이 스 를 요청 할 때 가지 고 있 는 매개 변수 대상 입 니 다.그 다음 에 우리 가 봉 인 된 post 방법 을 호출 했 습 니 다.post 방법의 첫 번 째 매개 변 수 는 우리 의 인터페이스 주소 이 고 두 번 째 매개 변 수 는 apiAddress 의 p 매개 변수 입 니 다.즉,인 터 페 이 스 를 요청 할 때 가지 고 있 는 매개 변수 대상 입 니 다.마지막 으로 export 를 통 해 apiAddress 를 내 보 냅 니 다.그리고 우리 페이지 에서 api 인 터 페 이 스 를 이렇게 호출 할 수 있 습 니 다.
import { apiAddress } from '@/request/api';// api
export default {
name: 'Address',
created () {
this.onLoad();
},
methods: {
//
onLoad() {
// api ,
apiAddress({
type: 0,
sort: 1
}).then(res => {
//
………………
})
}
}
}
다른 api 인 터 페 이 스 는 pai.js 에서 계속 아래로 확장 하면 됩 니 다.우정 힌트,모든 인터페이스 에 주석 을 달 아 주세요!!!api 인터페이스 관리의 장점 중 하 나 는 api 를 통일 적 으로 집중 시 키 는 것 이다.만약 에 후기 에 인 터 페 이 스 를 수정 해 야 한다 면 우 리 는 api.js 에서 해당 하 는 수정 을 찾 으 면 된다.모든 페이지 에서 우리 의 인 터 페 이 스 를 찾 지 않 고 수정 하면 매우 번 거 로 울 것 이다.문 제 는 만약 수 정 된 양 이 비교적 많 으 면 규격 gg 이다.그리고 만약 에 우리 의 업무 코드 에서 인 터 페 이 스 를 직접 수정 하면 자칫 우리 의 업무 코드 를 건 드 려 불필요 한 번 거 로 움 을 초래 하기 쉽다.자,마지막 으로 완 성 된 axios 패키지 코드 를 드 립 니 다.
/**axios
* 、 、
*/
import axios from 'axios';import QS from 'qs';
import { Toast } from 'vant';
import store from '../store/index'
//
if (process.env.NODE_ENV == 'development') {
axios.defaults.baseURL = '/api';
} else if (process.env.NODE_ENV == 'debug') {
axios.defaults.baseURL = '';
} else if (process.env.NODE_ENV == 'production') {
axios.defaults.baseURL = 'http://api.123dailu.com/';
}
//
axios.defaults.timeout = 10000;
// post
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
//
axios.interceptors.request.use(
config => {
// token, , http header token,
// token, token ,
const token = store.state.token;
token && (config.headers.Authorization = token);
return config;
},
error => {
return Promise.error(error);
})
//
axios.interceptors.response.use(
response => {
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 200
error => {
if (error.response.status) {
switch (error.response.status) {
// 401:
// ,
// , 。
case 401:
router.replace({
path: '/login',
query: { redirect: router.currentRoute.fullPath }
});
break;
// 403 token
//
// token vuex token
//
case 403:
Toast({
message: ' , ',
duration: 1000,
forbidClick: true
});
// token
localStorage.removeItem('token');
store.commit('loginSuccess', null);
// , fullPath ,
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404
case 404:
Toast({
message: ' ',
duration: 1500,
forbidClick: true
});
break;
// ,
default:
Toast({
message: error.response.data.message,
duration: 1500,
forbidClick: true
});
}
return Promise.reject(error.response);
}
}
);
/**
* get , get
* @param {String} url [ url ]
* @param {Object} params [ ]
*/
export function get(url, params){
return new Promise((resolve, reject) =>{
axios.get(url, {
params: params
})
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
/**
* post , post
* @param {String} url [ url ]
* @param {Object} params [ ]
*/
export function post(url, params) {
return new Promise((resolve, reject) => {
axios.post(url, QS.stringify(params))
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
총결산이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Nuxt.js】axios로 header에 Authorization를 항상 붙이고 싶다!투고자의 고민 ・JWT 인증의 앱으로 axios로 API 두드릴 때 headers에 Authorization:token을 붙이는 공통 처리를 만들고 싶다 (여러가지 기사 봐도 어쩔 수 없어···) 고민 해결 nuxt...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.