๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Development

[axios] axios 2

by DevIseo 2023. 1. 27.

axios?

  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•œ Promise ๊ธฐ๋ฐ˜์˜ ํด๋ผ์ด์–ธํŠธ
  • ์›๋ž˜๋Š” “XHR”์ด๋ผ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด AJAX ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋ณด๋‹ค ํŽธ๋ฆฌํ•œ AJAX ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋„์›€์„ ์คŒ
    • ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ํŒจํ‚ค์ง€๋กœ ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณต

์„ค์น˜

# npm ์‚ฌ์šฉํ•˜๊ธฐ:
$ npm install axios
# yarn ์‚ฌ์šฉํ•˜๊ธฐ:
$ yarn add axios

์‚ฌ์šฉ

axios.get('<https://jsonplaceholder.typicode.com/todos/1>') //Promise return
	.then(..)
	.catch(..)
//Axios ์‚ฌ์šฉํ•˜๊ธฐ

const URL = '<https://jsonplaceholder.typicode.com/todos/1><https://jsonplaceholder.typicode.com/todos/1>>'

async function test(){
  const response = await axios.get(URL)
  const data = response.data
  console.log(data.title)
}

test().catch(err=>console.log(err))

Axios API

axios์— ํ•ด๋‹น config๋ฅผ ์ „์†กํ•˜๋ฉด ์š”์ฒญ์ด ๊ฐ€๋Šฅ

  • axios(config)
    // node.js์—์„œ GET ์š”์ฒญ์œผ๋กœ ์›๊ฒฉ ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ
    axios({
      method: 'get',
      url: '<http://bit.ly/2mTM3nY>',
      responseType: 'stream'
    })
      .then(function (response) {
        response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
      });
    
// POST ์š”์ฒญ ์ „์†ก
axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});
  • axios(url[,config])
// GET ์š”์ฒญ ์ „์†ก (๊ธฐ๋ณธ๊ฐ’)
axios('/user/12345');

Axios ์ธ์Šคํ„ด์Šค

์‚ฌ์šฉ์ž ์ง€์ • config๋กœ ์ƒˆ๋กœ์šด Axios ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ์Œ

  • axios.create([config])
const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

์š”์ฒญ config

  • ์š”์ฒญ์„ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” config ์˜ต์…˜๋“ค
  • url ๋งŒ ํ•„์ˆ˜
  • method ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด GET ๋ฐฉ์‹์ด ๊ธฐ๋ณธ๊ฐ’
{
  // `url`์€ ์š”์ฒญ์— ์‚ฌ์šฉ๋  ์„œ๋ฒ„ URL์ž…๋‹ˆ๋‹ค.
  **url: '/user',**

  // `method`๋Š” ์š”์ฒญ์„ ์ƒ์„ฑํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.
  **method: 'get', // ๊ธฐ๋ณธ๊ฐ’**

  // `url`์ด ์ ˆ๋Œ€๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ `baseURL`์€ URL ์•ž์— ๋ถ™์Šต๋‹ˆ๋‹ค.
  // ์ƒ๋Œ€์ ์ธ URL์„ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•˜๋ ค๋ฉด `baseURL`์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  **baseURL: '<https://some-domain.com/api>',**

  // `transformRequest`๋Š” ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ธฐ ์ „์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  // ์ด๊ฒƒ์€ 'PUT', 'POST', 'PATCH', 'DELETE' ๋ฉ”์†Œ๋“œ์—์„œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  // ๋งˆ์ง€๋ง‰ ํ•จ์ˆ˜๋Š” Buffer, ArrayBuffer, FormData ๋˜๋Š” Stream์˜ ์ธ์Šคํ„ด์Šค ๋˜๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  // ํ—ค๋” ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  transformRequest: [function (data, headers) {
    // ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ์ž‘์—… ์ˆ˜ํ–‰

    return data;
  }],

  // `transformResponse`๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ then/catch๋กœ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  transformResponse: [function (data) {
    // ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ์ž‘์—… ์ˆ˜ํ–‰

    return data;
  }],

  // `headers`๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํ—ค๋”์ž…๋‹ˆ๋‹ค.
  **headers**: {'X-Requested-With': 'XMLHttpRequest'},

  // `params`์€ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†ก๋˜๋Š” URL ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค.
  // ๋ฐ˜๋“œ์‹œ ์ผ๋ฐ˜ ๊ฐ์ฒด๋‚˜ URLSearchParams ๊ฐ์ฒด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  // ์ฐธ๊ณ : null์ด๋‚˜ undefined๋Š” URL์— ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  **params**: {
    ID: 12345
  },

  // `paramsSerializer`๋Š” `params`์˜ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์˜ต์…˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  // (์˜ˆ: <https://www.npmjs.com/package/qs>, <http://api.jquery.com/jquery.param/>)
  paramsSerializer: function (params) {
    return Qs.stringify(params, {arrayFormat: 'brackets'})
  },

  // **`data`๋Š” ์š”์ฒญ ๋ฐ”๋””๋กœ ์ „์†ก๋  ๋ฐ์ดํ„ฐ**์ž…๋‹ˆ๋‹ค.  
  // 'PUT', 'POST', 'PATCH', 'DELETE' ๋ฉ”์†Œ๋“œ์—์„œ๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  // `transformRequest`๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ: FormData, File, Blob
  // - Node ์ „์šฉ: Stream, Buffer
  data: {
    firstName: 'Fred'
  },

  // ๋ฐ”๋””๋กœ ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋Œ€์•ˆ ๋ฌธ๋ฒ•
  // POST ๋ฉ”์†Œ๋“œ
  // ํ‚ค๊ฐ€ ์•„๋‹Œ ๊ฐ’๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  data: 'Country=Brasil&City=Belo Horizonte',

  // `timeout`์€ ์š”์ฒญ์ด ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜๊ธฐ ์ „์˜ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  // ์š”์ฒญ์ด `timeout`๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ์š”์ฒญ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.
  timeout: 1000, // ๊ธฐ๋ณธ๊ฐ’์€ `0` (ํƒ€์ž„์•„์›ƒ ์—†์Œ)

  // `withCredentials`์€ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์ดํŠธ ๊ฐ„ ์•ก์„ธ์Šค ์ œ์–ด ์š”์ฒญ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  withCredentials: false, // ๊ธฐ๋ณธ๊ฐ’

  // `adapter`'์€ ์ปค์Šคํ…€ ํ•ธ๋“ค๋ง ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  // ์œ ํšจํ•œ Promise ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (lib/adapters/README.md ์ฐธ๊ณ )
  adapter: function (config) {
    /* ... */
  },

  // `auth`๋Š” HTTP Basic ์ธ์ฆ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์ž๊ฒฉ ์ฆ๋ช…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  // `auth`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, `Authorization` ํ—ค๋”๊ฐ€ ์„ค์ •๋˜์–ด 
/ //`headers`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•œ ๊ธฐ์กด์˜ `Authorization` ์‚ฌ์šฉ์ž ์ง€์ • ํ—ค๋”๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  // ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด HTTP Basic ์ธ์ฆ๋งŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  // Bearer ํ† ํฐ ๋“ฑ์˜ ๊ฒฝ์šฐ `Authorization` ์‚ฌ์šฉ์ž ์ง€์ • ํ—ค๋”๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },

  // `responseType`์€ ์„œ๋ฒ„์—์„œ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
  // ์˜ต์…˜: 'arraybuffer', 'document', 'json', 'text', 'stream'
  // ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ: 'blob'
  **responseType: 'json', // ๊ธฐ๋ณธ๊ฐ’**

  // `responseEncoding`์€ ์‘๋‹ต ๋””์ฝ”๋”ฉ์— ์‚ฌ์šฉํ•  ์ธ์ฝ”๋”ฉ์ž…๋‹ˆ๋‹ค.
  // Node.js ์ „์šฉ
  // ์ฐธ๊ณ : ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์š”์ฒญ ๋˜๋Š” `responseType`์ด 'stream'์ด๋ฉด ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
  responseEncoding: 'utf8', // ๊ธฐ๋ณธ๊ฐ’

  // `xsrfCookieName`์€ xsrf ํ† ํฐ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ฟ ํ‚ค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  xsrfCookieName: 'XSRF-TOKEN', // ๊ธฐ๋ณธ๊ฐ’

  // `xsrfHeaderName`์€ xsrf ํ† ํฐ ๊ฐ’์„ ์šด๋ฐ˜ํ•˜๋Š” HTTP ํ—ค๋”์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  xsrfHeaderName: 'X-XSRF-TOKEN', // ๊ธฐ๋ณธ๊ฐ’

  // `onUploadProgress`๋Š” ์—…๋กœ๋“œ ์ง„ํ–‰ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  // ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ
  onUploadProgress: function (progressEvent) {
    // ์—…๋กœ๋“œ ์ง„ํ–‰ ์ด๋ฒคํŠธ ์ž‘์—… ์ˆ˜ํ–‰
  },

  // `onDownloadProgress`๋Š” ๋‹ค์šด๋กœ๋“œ๋กœ๋“œ ์ง„ํ–‰ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  // ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ
  onDownloadProgress: function (progressEvent) {
    // ๋‹ค์šด๋กœ๋“œ ์ง„ํ–‰ ์ด๋ฒคํŠธ ์ž‘์—… ์ˆ˜ํ–‰
  },

  // `maxContentLength`๋Š” node.js์—์„œ ํ—ˆ์šฉ๋˜๋Š” http ์‘๋‹ต ์ฝ˜ํ…์ธ ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ 
  //๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  maxContentLength: 2000,

  // `maxBodyLength`๋Š” ํ—ˆ์šฉ๋˜๋Š” http ์š”์ฒญ ์ฝ˜ํ…์ธ ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  // Node.js ์ „์šฉ
  maxBodyLength: 2000,

  // `validateStatus`๋Š” ์ง€์ •๋œ HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ์— ๋Œ€ํ•œ Promise๋ฅผ ์ดํ–‰ํ• ์ง€ ๋˜๋Š” ๊ฑฐ๋ถ€ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. 
  // ๋งŒ์•ฝ `validateStatus`๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด(๋˜๋Š” 'null' ๋˜๋Š” 'undefined'์œผ๋กœ ์„ค์ •) Promise๋Š” ์ดํ–‰๋ฉ๋‹ˆ๋‹ค.
  // ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๊ทธ Promise๋Š” ๊ฑฐ๋ถ€๋  ๊ฒƒ์ด๋‹ค.
  **validateStatus**: function (status) {
    return status >= 200 && status < 300; // ๊ธฐ๋ณธ๊ฐ’
  },

  // `maxRedirects`๋Š” node.js์—์„œ ๋ฆฌ๋””๋ ‰์…˜ ์ตœ๋Œ€๊ฐ’์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  // 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฆฌ๋””๋ ‰์…˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  maxRedirects: 5, // ๊ธฐ๋ณธ๊ฐ’

  // `socketPath`๋Š” node.js์—์„œ ์‚ฌ์šฉ๋  UNIX ์†Œ์ผ“์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  // ์˜ˆ: '/var/run/docker.sock' ๋„์ปค ๋ฐ๋ชฌ์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  // ์˜ค์ง `socketPath` ๋˜๋Š” `proxy`๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  // ๋‘˜ ๋‹ค ์ง€์ •๋˜๋ฉด `socketPath`๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  socketPath: null, // ๊ธฐ๋ณธ๊ฐ’

  // `httpAgent`์™€ `httpsAgent`๋Š” ๊ฐ๊ฐ node.js์—์„œ http ๋ฐ https ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์‚ฌ์šฉ์ž ์ง€์ • ์—์ด์ „ํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ `keepAlive`์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),

  // `proxy`๋Š” ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ ํ˜ธ์ŠคํŠธ์ด๋ฆ„, ํฌํŠธ, ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  // ๊ธฐ์กด์˜ `http_proxy`์™€ `https_proxy` ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
  // ํ”„๋ก์‹œ๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  // ํ”„๋ก์‹œ ๊ตฌ์„ฑ์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, 'no_proxy' ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ 
  // ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํ”„๋ก์‹œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋„๋ฉ”์ธ ๋ชฉ๋ก์œผ๋กœ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  // `false`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
  // `auth`๋Š” ํ”„๋ก์‹œ์— ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ HTTP Basic auth๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, 
  // ์ž๊ฒฉ ์ฆ๋ช…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด `Proxy-Authorization` ํ—ค๋”๊ฐ€ ์„ค์ •๋˜๊ณ ,
  // `headers`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด์˜ `Proxy-Authorization` ์‚ฌ์šฉ์ž ์ง€์ • ํ•ด๋”๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  // ๋งŒ์•ฝ ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ HTTPS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ํ”„๋กœํ† ์ฝœ์„ ๋ฐ˜๋“œ์‹œ `https`๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  proxy: {
    protocol: 'https',
    host: '127.0.0.1',
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

  // `cancelToken`์€ ์š”์ฒญ์„ ์ทจ์†Œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์†Œ ํ† ํฐ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  // (์ž์„ธํ•œ ๋‚ด์šฉ์€ ์š”์ฒญ ์ทจ์†Œ ์„น์…˜ ์ฐธ์กฐ)
  cancelToken: new CancelToken(function (cancel) {
  }),

  // `decompress`๋Š” ์‘๋‹ต ๋ฐ”๋””์˜ ์ž๋™ ์••์ถ• ํ•ด์ œ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  //  `true`๋กœ ์„ค์ •ํ•˜๋ฉด, ์••์ถ• ํ•ด์ œ๋œ ๋ชจ๋“  ์‘๋‹ต์—์„œ 'content-encoding' ํ—ค๋”๋„ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  // Node.js ์ „์šฉ (XHR์€ ์••์ถ• ํ•ด์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค)
  decompress: true // ๊ธฐ๋ณธ๊ฐ’

}

์‘๋‹ต ์Šคํ‚ค๋งˆ

{
  // `data`๋Š” ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์‘๋‹ต์ž…๋‹ˆ๋‹ค.
  data: {},

  // `status`๋Š” HTTP ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
  status: 200,

  // `statusText`๋Š” HTTP ์ƒํƒœ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.
  statusText: 'OK',

  // `headers`๋Š” HTTP ํ—ค๋”์ž…๋‹ˆ๋‹ค.
  // ๋ชจ๋“  ํ—ค๋” ์ด๋ฆ„์€ ์†Œ๋ฌธ์ž์ด๋ฉฐ, ๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  // ์˜ˆ์‹œ: `response.headers['content-type']`
  headers: {},

  // `config`๋Š” ์š”์ฒญ์„ ์œ„ํ•ด `Axios`๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.
  config: {},

  // `request`๋Š” ์ด๋ฒˆ ์‘๋‹ต์œผ๋กœ ์ƒ์„ฑ๋œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.
  // ์ด๊ฒƒ์€ node.js์—์„œ ๋งˆ์ง€๋ง‰ ClientRequest ์ธ์Šคํ„ด์Šค ์ž…๋‹ˆ๋‹ค.
  // ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” XMLHttpRequest์ž…๋‹ˆ๋‹ค.
  request: {}
}
  • then์„ ์‚ฌ์šฉ์‹œ ๋ฐ›๋Š” ์‘๋‹ต
axios.get('/user/12345')
  .then(function (response) {
    console.log(response.data);
    console.log(response.status);
    console.log(response.statusText);
    console.log(response.headers);
    console.log(response.config);
  });

Config ๊ธฐ๋ณธ๊ฐ’

๋ชจ๋“  ์š”์ฒญ์— ์ ์šฉ๋  config ๊ธฐ๋ณธ๊ฐ’ ์ง€์ • ๊ฐ€๋Šฅ

*์ „์—ญ Axios ๊ธฐ๋ณธ๊ฐ’

axios.defaults.baseURL = '<https://api.example.com>';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

*์ปค์Šคํ…€ ์ธ์Šคํ„ด์Šค ๊ธฐ๋ณธ๊ฐ’

// ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ• ๋•Œ config ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •ํ•˜๊ธฐ
const instance = axios.create({
  baseURL: '<https://api.example.com>'
});

// ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“  ํ›„ ๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

*Config ์šฐ์„  ์ˆœ์œ„

Config๋Š” ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ๋ณ‘ํ•ฉ

lib/defaults.js๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ์˜ ๊ธฐ๋ณธ๊ฐ’, ์ธ์Šคํ„ด์Šค์˜ defaults์†์„ฑ, ์š”์ฒญ์˜ config์ธ์ž๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ฐพ์Œ. ํ›„์ž๊ฐ€ ์ „์ž๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Œ..

// ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” config ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค ๋งŒ๋“ค๊ธฐ
// ์ด ๋•Œ timeout ๊ฐ’์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋ณธ๊ฐ’์ธ '0'
const instance = axios.create();

// ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ timeout ๊ฐ’ ์žฌ์ •์˜
// ์ด์ œ ๋ชจ๋“  ์š”์ฒญ์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ „ 2.5์ดˆ ๋Œ€๊ธฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉ
instance.defaults.timeout = 2500;

// ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ timeout ๊ฐ’ ์žฌ์ •์˜
instance.get('/longRequest', {
  timeout: 5000
});

์ธํ„ฐ์…‰ํ„ฐ

then ๋˜๋Š” catch๋กœ ์ฒ˜๋ฆฌ ๋˜๊ธฐ ์ „์— ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Œ

// ์š”์ฒญ ์ธํ„ฐ์…‰ํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ
axios.interceptors.request.use(function (config) {
    // ์š”์ฒญ์ด ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ์ž‘์—… ์ˆ˜ํ–‰
    return config;
  }, function (error) {
    // ์š”์ฒญ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ž‘์—… ์ˆ˜ํ–‰
    return Promise.reject(error);
  });

// ์‘๋‹ต ์ธํ„ฐ์…‰ํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ
axios.interceptors.response.use(function (response) {
    // 2xx ๋ฒ”์œ„์— ์žˆ๋Š” ์ƒํƒœ ์ฝ”๋“œ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•ฉ๋‹ˆ๋‹ค.
    // ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ž‘์—… ์ˆ˜ํ–‰
    return response;
  }, function (error) {
    // 2xx ์™ธ์˜ ๋ฒ”์œ„์— ์žˆ๋Š” ์ƒํƒœ ์ฝ”๋“œ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•ฉ๋‹ˆ๋‹ค.
    // ์‘๋‹ต ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ž‘์—… ์ˆ˜ํ–‰
    return Promise.reject(error);
  });
  • ์ธํ„ฐ์…‰ํ„ฐ ์ œ๊ฑฐ
const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
  • ์ปค์Šคํ…€ ์ธ์Šคํ„ด์Šค์—์„œ๋„ ์ธํ„ฐ์…‰ํ„ฐ ์ถ”๊ฐ€
const instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

์—๋Ÿฌ ํ•ธ๋“ค๋ง

axios.get('/user/12345')
  .catch(function (error) {
    if (error.response) {
      // ์š”์ฒญ์ด ์ „์†ก๋˜์—ˆ๊ณ , ์„œ๋ฒ„๋Š” 2xx ์™ธ์˜ ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      // ์š”์ฒญ์ด ์ „์†ก๋˜์—ˆ์ง€๋งŒ, ์‘๋‹ต์ด ์ˆ˜์‹ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. 
      // 'error.request'๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ XMLHtpRequest ์ธ์Šคํ„ด์Šค์ด๊ณ ,
      // node.js์—์„œ๋Š” http.ClientRequest ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.
      console.log(error.request);
    } else {
      // ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์ฒญ์„ ์„ค์ •ํ•˜๋Š” ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
      console.log('Error', error.message);
    }
    console.log(error.config);
  });
  • validateStatus config ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด, ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” HTTP ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ
axios.get('/user/12345', {
  validateStatus: function (status) {
    return status < 500; // ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 500 ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๊ฒฐ
  }
})
  • toJSON์„ ์‚ฌ์šฉํ•˜๋ฉด, HTTP ์—๋Ÿฌ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๊ฐ์ฒด ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์˜ด
axios.get('/user/12345')
  .catch(function (error) {
    console.log(error.toJSON());
  });

 

Reference

https://yamoo9.github.io/axios/guide/api.html

'Development' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฐ”๋ฒจ(Babel)  (0) 2023.06.15
์›นํŒฉ(Webpack)  (0) 2023.06.15
[axios] axios 1  (0) 2023.01.21
[npm].npmrc  (0) 2023.01.19

๋Œ“๊ธ€