Axios는 node.js와 browser를 위한 Promise 기반의 HTTP client입니다.
서버나 기타 API에 네트워크 요청이 필요할 때, Axios, Fetch 또는 Ajax를 통해 HTTP 통신을 할 수 있습니다.
Axios를 이용해 네트워크 요청을 하면 resolve 또는 reject할 수 있는 promise를 반환받습니다.
npm
$ npm install axios
bower
$ bower install axios
yarn
$ yarn add axios
jsDelivr CDN
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
unpkg CDN
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
Axios는 get
, post
, put
, delete
, patch
, head
, options
등과 같은 메소드를 지원합니다.
아래 예제에서는 HTTP 통신 확인을 위해 아래 API를 사용합니다.
code>
import axios from 'axios';
const urlAPI = 'https://jsonplaceholder.typicode.com/';
axios.get(urlAPI + '/posts?ID=1')
.then(function(response) { // 통신 성공 핸들링
console.log(response);
})
.catch(function(error) { // 통신 에러 핸들링
console.log(error);
})
.then(function() { // 항상 실행되는 영역
console.log("finish axios");
})
result>
{data: Array(100), status: 200, statusText: '', headers: {…}, config: {…}, …}
finish axios
위 예제에서 query string을 params를 통해 전달할 수도 있습니다.
code>
import axios from 'axios';
const urlAPI = 'https://jsonplaceholder.typicode.com/';
axios.get(urlAPI + '/posts', {
params: {
ID: 1,
}
})
.then(function(response) { // 통신 성공 핸들링
console.log(response);
})
.catch(function(error) { // 통신 에러 핸들링
console.log(error);
})
.then(function() { // 항상 실행되는 영역
console.log("finish axios");
})
체이닝으로 구현한 코드에 async/await
의 적용도 가능합니다.
code>
import axios from 'axios';
const urlAPI = 'https://jsonplaceholder.typicode.com';
const getPosts = async() => {
try {
const response = await axios.get(urlAPI + '/posts?ID=1');
console.log(response);
} catch(error) {
console.log(error);
}
};
getPosts();
Axios를 통해 POST요청을 할 땐 객체 형태로 data 전달이 가능합니다.
code>
import axios from 'axios';
const urlAPI = 'https://jsonplaceholder.typicode.com';
const dataBody = {
title: 'POST',
body: 'sample',
userId: 1,
}
const postPosts = async() => {
try {
const response = await axios.post(urlAPI + '/posts', dataBody);
console.log(response);
} catch(error) {
console.log(error);
}
};
postPosts();
result>
{data: {…}, status: 201, statusText: '', headers: {…}, config: {…}, …}
axios API에 config를 전달해 HTTP 요청이 가능합니다.
config는 객체 형태로 url
만 필수입니다.
{
// 필수 값
url: '/posts',
// url이 절대경로가 아니면 url 앞에 붙는 값
baseURL: 'https://jsonplaceholder.typicode.com',
// HTTP method, default value: get
method: 'get',
// 요청 데이터를 서버로 전송 전 변경
trasnformRequest: [function(data, headers) {
// 데이터 변환 작업
return data;
}],
// 응답 데이터가 then/catch로 전달 전 변경
transformResponse: [function(data) {
// 데이터 변환 작업
return data;
}],
// 사용자 지정 헤더
headers: {'X-Requested-With': 'XMLHttpRequest'},
// 요청과 함께 전송되는 URL 파라미터
// null이나 undefined는 URL에 렌더링 되지 않음
params: {
ID: 1
},
// params 배열 시리얼라이즈
paramsSerializer: function(params) {
return Qs.stringify(params, {arrayFormat: 'brackets'})
},
// Request body로 전송될 데이터
// PUT, POST, PATCH, DELETE 메소드에서만 적용 가능
data: {
key: 'value',
},
// Request body로 전송될 데이터의 대안 문법
// POST 메소드에서 적용 가능
// 키는 제외하고 값만 전달
data: 'Country=Korea&City=Seoul',
// 요청이 timout 지정값[ms]보다 오래 걸리면 요청 중단
// default value: 0
timeout: 0,
// 자격 증명을 사용하여 사이트 간 액세스 제어 요청 필요 여부를 나타내는 속성
// default vlue: false
withCredentials: false,
// Authorization 헤더가 설정되고 HTTP Basic 인증이 사용됨
auth: {
username: 'hyeonsik',
password: 'pass1word2',
},
// 서버에서 받는 데이터의 타입
// default value: json
// option: 'arraybuffer', 'document', 'json', 'text', 'stream', 'blob'(브라우저 전용)
responseType: 'json',
// 응답 디코딩에 사용할 인코딩
// node.js 전용
responseEncoding: 'utf8',
// xsrf 토큰 값으로 사용할 쿠키의 이름
// default value: XSRF-TOKEN
xsrfCookieName: 'XSRF-TOKEN',
// `토큰 값을 운반하는 HTTP 헤더의 이름
// default value: X-XSRF-TOKEN
xsrfHeaderName: 'X-XSRF-TOKEN',
// 업로드 진행 이벤트를 처리
// 브라우저 전용
onUploadProgress: function (progressEvent) {
// 업로드 진행 이벤트 작업 수행
},
// `다운로드 진행 이벤트를 처리
// 브라우저 전용
onDownloadProgress: function (progressEvent) {
// 다운로드 진행 이벤트 작업 수행
},
// node.js에서 허용되는 http 응답 콘텐츠의 최대 크기를 바이트 단위로 정의
maxContentLength: 2000,
// 허용되는 http 요청 콘텐츠의 최대 크기를 바이트 단위로 정의
// Node.js 전용
maxBodyLength: 2000,
// 지정된 HTTP 응답 상태 코드에 대한 Promise를 이행할지 또는 거부할지 여부를 정의
// 만약 `validateStatus`가 true를 반환하면(또는 'null' 또는 'undefined'으로 설정) Promise resolve
// 그렇지 않으면, Promise reject
validateStatus: function (status) {
return status >= 200 && status < 300; // 기본값
},
// node.js에서 리디렉션 최대값을 정의
// 0으로 설정하면 리디렉션되지 않습니다.
maxRedirects: 5, // 기본값
// node.js에서 사용될 UNIX 소켓을 정의
socketPath: null, // 기본값
// node.js에서 http 및 https 요청을 수행할 때 사용할 사용자 지정 에이전트를 정의
// 이렇게 하면 기본적으로 활성화되지 않은 `keepAlive`와 같은 옵션을 추가할 수 있습니다.
httpAgent: new http.Agent({ keepAlive: true }),
httpsAgent: new https.Agent({ keepAlive: true }),
// 프록시 서버의 호스트이름, 포트, 프로토콜을 정의합니다.
// 기존의 `http_proxy`와 `https_proxy` 환경 변수를 사용 가능
// `false`를 사용하면 프록시를 사용하지 않고, 환경 변수를 무시합니다.
// `auth`는 프록시에 연결하는데 HTTP Basic auth를 사용해야 함을 나타내며 자격 증명을 제공
// 만약 프록시 서버가 HTTPS를 사용한다면, 프로토콜을 반드시 `https`로 설정해야 합니다.
proxy: {
protocol: 'https',
host: '127.0.0.1',
port: 9000,
auth: {
username: 'mikeymike',
password: 'rapunz3l'
}
},
// 요청을 취소하는 데 사용할 수 있는 취소 토큰을 지정
cancelToken: new CancelToken(function (cancel) {
}),
// 응답 바디의 자동 압축 해제 여부를 나타냅니다.
// `true`로 설정하면, 압축 해제된 모든 응답에서 'content-encoding' 헤더도 제거
// Node.js 전용
decompress: true // 기본값
}
code>
import axios from 'axios';
const urlAxios = 'https://jsonplaceholder.typicode.com';
const configGet = {
method: 'get',
baseURL: urlAxios,
params: {
userId: 1,
}
};
const axiosApiGet = async() => {
try {
const response = await axios('/posts', configGet);
console.log(response);
} catch(error) {
console.log(error);
}
}
axiosApiGet();
result>
{data: Array(10), status: 200, statusText: '', headers: {…}, config: {…}, …}
code>
import axios from 'axios';
const urlAxios = 'https://jsonplaceholder.typicode.com';
const dataPost = {
title: 'title',
body: 'body',
userId: 1,
};
const configPost = {
method: 'post',
baseURL: urlAxios,
data: dataPost,
};
export const axiosApiPost = async() => {
try {
const response = await axios('/posts', configPost);
console.log(response);
} catch(error) {
console.log(error);
}
}
axiosApiPost();
result>
{data: {…}, status: 201, statusText: '', headers: {…}, config: {…}, …}
Axios API는 아래와 같은 메소드들을 지원합니다.
axios(config)
axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.options(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])
create
메소드를 통해 사용자 지정 config가 적용된 axios 인스턴스 생성이 가능합니다.
import axios from 'axios';
const urlAxios = 'https://jsonplaceholder.typicode.com';
const axiosInstance = axios.create({
baseURL: urlAxios,
timeout: 1000,
});
위에서 생성한 axios 인스턴스를 통해 사용자 지정 config가 적용된 메소드 호출이 가능합니다.
code>
const configGet = {
method: 'get',
params: {
userId: 1,
}
};
export const axiosInstanceGet = async() => {
try {
const response = await axiosInstance.get('/posts', configGet);
console.log(response);
} catch(error) {
console.log(error);
}
}
axiosInstanceGet();
result>
{data: Array(10), status: 200, statusText: '', headers: {…}, config: {…}, …}
code>
const dataPost = {
title: 'title',
body: 'body',
userId: 1,
};
const configPost = {
method: 'post',
data: dataPost,
};
export const axiosInstancePost = async() => {
try {
const response = await axiosInstance('/posts', configPost);
console.log(response);
} catch(error) {
console.log(error);
}
}
axiosInstancePost();
result>
{data: {…}, status: 201, statusText: '', headers: {…}, config: {…}, …}
요청에 대한 응답은 아래와 같은 정보를 반환해줍니다.
{
// 서버가 제공하는 응답
data: {},
// HTTP 상태 코드
status: 200,
// HTTP 상태 메시지
statusText: 'OK',
// HTTP 헤더
// 모든 헤더 이름은 소문자이며, 괄호 표기법을 사용하여 접근 가능
// 예시: `response.headers['content-type']`
headers: {},
// 요청을 위해 `Axios`가 제공하는 구성
config: {},
// 이번 응답으로 생성된 요청
// node.js에서 마지막 ClientRequest 인스턴스
// 브라우저에서 XMLHttpRequest
request: {}
}
전역의 axios에 config 기본값 설정이 가능합니다.
import axios from "axios";
axios.defaults.baseURL = 'https://jsonplaceholder.typicode.com';
axios.defaults.timeout = 1000;
axios에 config를 적용하는 방법들은 아래와 같습니다.
위 config 중, 아래가 더 높은 우선순위를 갖습니다.
code>
import axios from "axios";
axios.defaults.timeout = 1000;
const instance = axios.create({
timeout: 2000,
})
instance.get('/url', {
timeout: 3000,
})
axios의 요청 및 응답이 then
또는 catch
로 전달되기 전 인터셉터를 추가하거나 삭제할 수 있습니다.
// request에 interceptors 추가
const interceptorRequest = axios.interceptors.request.use(function(config) {
// 요청 전달 전 작업
return config;
}, function(error) {
// 요청 오류에 대한 작업
return Promise.reject(error);
});
// request에 interceptors 제거
axios.interceptors.request.eject(interceptorRequest);
// response에 interceptors 추가
const interceptorResponse = axios.interceptors.response.use(function(response) {
// 응답 데이터에 대한 작업
return response;
}, function(error) {
// 응답 오류에 대한 작업
return Promise.reject(error);
});
// request에 interceptors 제거
axios.interceptors.response.eject(interceptorResponse);