어떻게 액시오스 요격기를 사용할 수 있습니까?
액시오스 문서를 보긴 했지만, 그 문서에 나오는 건
// Add a request interceptor
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
return Promise.reject(error);
});
또한 많은 튜토리얼에서 이 코드만 보여주지만 무엇에 사용되는지 혼란스럽습니다. 누가 따라 할 간단한 예를 들어주실 수 있나요?
간단히 말하면, 그것은 모든 HTTP 작업에 대한 체크포인트에 가깝습니다.모든 API 호출은 이 인터셉터를 통해 전달됩니다.
그럼 왜 요격기 두 대죠?
API 호출은 요청과 응답 두 개의 반으로 구성됩니다.체크포인트처럼 동작하기 때문에 요청과 응답에는 별도의 인터셉터가 있습니다.
일부 요청 가로채기 사용 사례 -
요청하기 전에 자격 증명이 유효한지 확인해야 한다고 가정합니다.따라서 실제로 API 호출을 하는 대신 인터셉트 레벨에서 자격 증명이 유효한지 확인할 수 있습니다.
Axios 호출 때마다 토큰 추가 로직을 복제하는 대신, 요청할 때마다 토큰을 첨부하는 인터셉터를 만들 수 있습니다.
일부 응답 가로채기 사용 사례 -
응답을 받았다고 가정하고, 사용자가 로그인한 것으로 추론하고자 하는 API 응답으로 판단합니다.따라서 응답 인터셉터에서는 사용자 로그인 상태를 처리하는 클래스를 초기화하고 수신한 응답 개체에 맞게 업데이트할 수 있습니다.
유효한 API 자격 증명을 가진 일부 API를 요청했지만 데이터에 액세스할 수 있는 유효한 역할이 없다고 가정합니다.따라서 응답 인터셉터에서 사용자가 허용되지 않음을 알리는 경고를 트리거할 수 있습니다.이렇게 하면 Axios에서 요청한 모든 Axios에 대해 수행해야 하는 권한 없는 API 오류 처리로부터 보호받을 수 있습니다.
다음은 몇 가지 코드 예시입니다.
요청 인터셉터
(이 경우 환경 변수를 확인하여) 다음과 같이 함으로써 (필요한 경우) axios의 구성 개체를 인쇄할 수 있습니다.
const DEBUG = process.env.NODE_ENV === "development"; axios.interceptors.request.use((config) => { /** In dev, intercepts request and logs it into console for dev */ if (DEBUG) { console.info("✉️ ", config); } return config; }, (error) => { if (DEBUG) { console.error("✉️ ", error); } return Promise.reject(error); });전달 중인 헤더를 확인하거나 일반 헤더를 추가하려면 다음에서 사용할 수 있습니다.
config.headers물건. 예를 들어:예를 들어,axios.interceptors.request.use((config) => { config.headers.genericKey = "someGenericValue"; return config; }, (error) => { return Promise.reject(error); });에는일 .
GET할 쿼리 합니다에서 수 . 전송되는 쿼리 매개 변수는config.params물건.
응답 인터셉터
인터셉터 레벨에서 API 응답을 선택적으로 파싱하고 원래 응답 대신 파싱된 응답을 전달할 수도 있습니다.API를 여러 곳에서 동일한 방식으로 사용할 경우 파싱 로직 작성 시간을 몇 번이고 절약할 수 있습니다.한 가지 방법은 에 추가 파라미터를 전달하는 것입니다.
api-request그리고 응답 인터셉터에서 동일한 파라미터를 사용하여 작업을 수행합니다.예를 들어,//Assume we pass an extra parameter "parse: true" axios.get("/city-list", { parse: true });일단 응답 인터셉터에서 다음과 같이 사용할 수 있습니다.
axios.interceptors.response.use((response) => { if (response.config.parse) { //perform the manipulation here and change the response object } return response; }, (error) => { return Promise.reject(error.message); });그래서 이 경우에는, 언제든지,
parse반대하다, 반대하다, 반대하다, 반대하다, 반대하다, 반대하다, 반대.response.config, 조작은 끝났지만 나머지 사건들은 그대로 될 겁니다도착하는 모습까지 볼 수 있습니다.
HTTP코드를 작성한 다음 결정을 내립니다.예를 들어,axios.interceptors.response.use((response) => { if(response.status === 401) { alert("You are not authorized"); } return response; }, (error) => { if (error.response && error.response.data) { return Promise.reject(error.response.data); } return Promise.reject(error.message); });
예를 들어, 요청이 전송된 순간부터 응답을 수신한 순간까지 걸리는 시간을 파악하려면 다음 코드를 사용할 수 있습니다.
const axios = require("axios");
(async () => {
axios.interceptors.request.use(
function (req) {
req.time = { startTime: new Date() };
return req;
},
(err) => {
return Promise.reject(err);
}
);
axios.interceptors.response.use(
function (res) {
res.config.time.endTime = new Date();
res.duration =
res.config.time.endTime - res.config.time.startTime;
return res;
},
(err) => {
return Promise.reject(err);
}
);
axios
.get("http://localhost:3000")
.then((res) => {
console.log(res.duration)
})
.catch((err) => {
console.log(err);
});
})();
이는 미들웨어와 같은 것으로, 기본적으로 모든 요청(GET, POST, PUT, DELETE) 또는 모든 응답(서버에서 받는 응답)에 추가됩니다.권한 부여와 관련된 경우에 사용되는 경우가 많습니다.
이것을 보십시오.Axios 인터셉터 및 비동기 로그인
다른 예를 가진 https://medium.com/ @ danielalvidrez/handling-error-responses-with-grace-b6fd3c5886f0에 대한 다른 기사가 있습니다.
예 중 하나의 요점은 인터셉터를 사용하여 권한 부여 토큰이 만료되었는지(예를 들어 403인 경우)를 탐지하고 페이지를 리디렉션할 수 있다는 것입니다.
제가 실제 프로젝트에서 사용했던 실용적인 활용 사례를 알려드리겠습니다.제가 주로 쓰는 건.request interceptor토큰 관련 직원(accessToken,refreshToken), 예를 들어 토큰이 만료되지 않았는지 여부(예: 만료된 경우 새로 고침으로 업데이트합니다.다른 모든 통화를 토큰화하고 해결될 때까지 보류합니다.하지만 제가 가장 좋아하는 것은 악시오스 입니다.response interceptors아래와 같이 앱 글로벌 오류 처리 로직을 배치할 수 있습니다.
httpClient.interceptors.response.use(
(response: AxiosResponse) => {
// Any status code that lie within the range of 2xx cause this function to trigger
return response.data;
},
(err: AxiosError) => {
// Any status codes that falls outside the range of 2xx cause this function to trigger
const status = err.response?.status || 500;
// we can handle global errors here
switch (status) {
// authentication (token related issues)
case 401: {
return Promise.reject(new APIError(err.message, 409));
}
// forbidden (permission related issues)
case 403: {
return Promise.reject(new APIError(err.message, 409));
}
// bad request
case 400: {
return Promise.reject(new APIError(err.message, 400));
}
// not found
case 404: {
return Promise.reject(new APIError(err.message, 404));
}
// conflict
case 409: {
return Promise.reject(new APIError(err.message, 409));
}
// unprocessable
case 422: {
return Promise.reject(new APIError(err.message, 422));
}
// generic api error (server related) unexpected
default: {
return Promise.reject(new APIError(err.message, 500));
}
}
}
);
이거 어때요?새 Axios 인스턴스를 만들고 여기에 인터셉터를 연결합니다.그러면 당신은 당신의 앱 어디에서나 그 인터셉터를 사용할 수 있습니다.
export const axiosAuth = axios.create()
//we intercept every requests
axiosAuth.interceptors.request.use(async function(config){
//anything you want to attach to the requests such as token
return config;
}, error => {
return Promise.reject(error)
})
//we intercept every response
axiosAuth.interceptors.response.use(async function(config){
return config;
}, error => {
//check for authentication or anything like that
return Promise.reject(error)
})
그럼 당신이 사용합니다.axiosAuth당신이 사용하는 것과 같은 방식axios
이것이 내 프로젝트에서 내가 하던 방식입니다.코드 스니펫은 axios 인터셉터에서 액세스 및 리프레쉬 토큰을 사용하는 방법을 나타내며 리프레쉬 토큰 기능을 구현하는 데 도움이 됩니다.
const API_URL =
process.env.NODE_ENV === 'development'
? 'http://localhost:8080/admin/api'
: '/admin-app/admin/api';
const Service = axios.create({
baseURL: API_URL,
headers: {
Accept: 'application/json',
},
});
Service.interceptors.request.use(
config => {
const accessToken = localStorage.getItem('accessToken');
if (accessToken) {
config.headers.common = { Authorization: `Bearer ${accessToken}` };
}
return config;
},
error => {
Promise.reject(error.response || error.message);
}
);
Service.interceptors.response.use(
response => {
return response;
},
error => {
let originalRequest = error.config;
let refreshToken = localStorage.getItem('refreshToken');
const username = EmailDecoder(); // decode email from jwt token subject
if (
refreshToken &&
error.response.status === 403 &&
!originalRequest._retry &&
username
) {
originalRequest._retry = true;
return axios
.post(`${API_URL}/authentication/refresh`, {
refreshToken: refreshToken,
username,
})
.then(res => {
if (res.status === 200) {
localStorage.setItem(
'accessToken',
res.data.accessToken
);
localStorage.setItem(
'refreshToken',
res.data.refreshToken
);
originalRequest.headers[
'Authorization'
] = `Bearer ${res.data.accessToken}`;
return axios(originalRequest);
}
})
.catch(() => {
localStorage.clear();
location.reload();
});
}
return Promise.reject(error.response || error.message);
}
);
export default Service;
저는 다음과 같은 방법으로 구현하였습니다.
httpConfig.js
import axios from 'axios'
import { baseURL } from '../utils/config'
import { SetupInterceptors } from './SetupInterceptors'
const http = axios.create({
baseURL: baseURL
})
SetupInterceptors(http)
export default http
설정Intercepters.js
import { baseURL } from '../utils/config'
export const SetupInterceptors = http => {
http.interceptors.request.use(
config => {
config.headers['token'] = `${localStorage.getItem('token')}`
config.headers['content-type'] = 'application/json'
return config
},
error => {
return Promise.reject(error)
}
)
http.interceptors.response.use(function(response) {
return response
}, function (error) {
const status = error?.response?.status || 0
const resBaseURL = error?.response?.config?.baseURL
if (resBaseURL === baseURL && status === 401) {
if (localStorage.getItem('token')) {
localStorage.clear()
window.location.assign('/')
return Promise.reject(error)
} else {
return Promise.reject(error)
}
}
return Promise.reject(error)
})
}
export default SetupInterceptors
참조 : 링크
언급URL : https://stackoverflow.com/questions/52737078/how-can-you-use-axios-interceptors
'programing' 카테고리의 다른 글
| 만약 블록 인사이드 에코 문장이라면? (0) | 2023.10.22 |
|---|---|
| 레일/앵글 배포 시 알 수 없는 공급자 오류JS 앱에서 헤로쿠로 (0) | 2023.10.22 |
| 선언 지정자에 둘 이상의 데이터 형식 오류가 있습니다. (0) | 2023.10.22 |
| MySQL에서 데이터를 저장하는 방법 (0) | 2023.10.22 |
| 연산자 문제 Oracle에 없음 (0) | 2023.10.22 |