Axios interceptor

김태영·2023년 6월 16일
0

Axios interceptor

Axios interceptor란?

Axios docs - interceptor를 보면 Promise 응답에 대해 then, catch로 처리되기 전에 요청과 응답을 가로챌 수 있다고 나와있음.

처음엔 refreshToken 자동발급을 해결하기 위해 사용했는데, 사용하다보니 정말 편하다는걸 느꼈다

//refresh//
interface AuthResponse {
    accessToken: string;
    refreshToken: string;
  }
  api.interceptors.response.use(
    (response: AxiosResponse) => response,
    async (error) => {
      const originalRequest = error.config;

      if (error.response?.status === 401 && !originalRequest._retry) {
        originalRequest._retry = true;

        try {
          const res = await api.post<AuthResponse>("/user/reissue", {
            headers: {
              RefreshToken: `Bearer ${refreshToken}`,
            },
          });

          setAccessToken(res.data.accessToken);
          setRefreshToken(res.data.refreshToken);

          localStorage.setItem("accessToken", accessToken);
          localStorage.setItem("refreshToken", refreshToken);

          axios.defaults.headers.common[
            "Authorization"
          ] = `Bearer ${accessToken}`;

          return api(originalRequest);
        } catch (e) {}
      }

      return Promise.reject(error);
    }
  );

위 코드를 설명하자면 401 코드가 응답으로 왔을때, refreshToken URL로 post를 날려준다

post 응답으로 다시 생성된 accessToken과 refresToken을 저장해주는 코드이다

내가 interceptor를 사용한 제일 큰 이유는

각각의 api 요청을 보낼 때 마다 불필요한 axios 코드를 줄이기 위해서 생성했다.

axios 코드마다 동일한 accessToken을 헤더에 담아 보내주는 등의 반복적인 작업을 줄일 수 있음

const accessToken = localStorage.getItem("accessToken");
export const api = axios.create({
  baseURL: "http://3.35.129.231:8080",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${accessToken}`,
  },
  timeout: 12000,
});

axios.create로 baseURL 설정, header값(accessToken) 설정을 해주고

const getNewsBrandList = async () => {
  const response = await api.get("/news/press");
  return response.data.map((item: selectedNewsListType) => item.pressName);
};

비동기 요청이 필요한 곳에서{api}를 import 해주고 위와같이 사용하면

const response = await axios.get("http://3.35.129.231:8080/news/press", 
	headers: {
	"Content-Type": "application/json",
	Authorization: `Bearer ${accessToken}`,
},
timeout: 12000,
});

위 코드와 같은 기능을 하게됨.

필요한 곳에 api를 임포트 해주고 사용하면 정말 간편하다.

아직 모든기능을 익힌건 아닌거 같아 개인적으로 따로 공부해봐야 할것같다

profile
구렁이

0개의 댓글