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)  
  }) 
 });
}
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기