Axios: ๊ธฐ๋ณธ ํ—ค๋”๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Œ

์— ๋งŒ๋“  2016๋…„ 07์›” 19์ผ  ยท  64์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: axios/axios

ํ—ค๋”๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ๊ฐœ๋ณ„ ์š”์ฒญ์—์„œ ํ—ค๋”๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. null ๋˜๋Š” undefined ์„ค์ •ํ•ด๋„ ์•„๋ฌด ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

transformRequest: [(data, headers) => {
    delete headers.common.Authorization
    return data
}]

๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™

๋ชจ๋“  64 ๋Œ“๊ธ€

๊ทธ ๋™์ž‘์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ๊ธฐ๋ณธ ํ—ค๋”๋ฅผ ์„ค์ • ํ•ด์ œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ?

axios.defaults.headers.common['Content-Type'] = 'application/json' ์„ค์ •ํ•˜๋ฉด ๊ฐœ๋ณ„ ์š”์ฒญ์— ๋Œ€ํ•ด ํ•ด๋‹น ํ—ค๋”๋ฅผ ์„ค์ • ํ•ด์ œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ๋งŒ โ€‹โ€‹์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—ค๋” ์„ค์ •์„ ํ•ด์ œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

axios.request('/path', {
  headers: {
    'Content-Type': null
  }
});

์˜ˆ. ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋‹ค

์ œ ์˜ˆ์ œ์—์„œ method ๋ฅผ ๋†“์นœ ๊ฒƒ์„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฐฉ๋ฒ•๋„ ์„ค์ •ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. undefined ๊ฐ’์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์ง€ ์•Š๋Š” ์–ด๋”˜๊ฐ€์˜ Object.assign() ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@tyrsius ์–ด๋–ค ๋ฒ„์ „์˜

์ฐธ๊ณ ๋กœ ๋‚ด ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

it('should remove default headers when config indicates', function (done) {
  var instance = axios.create();
  instance.defaults.headers.common['Content-Type'] = 'application/json';

  instance.post('/foo/bar/', {
    firstName: 'foo',
    lastName: 'bar'
  }, {
    headers: {
      'Content-Type': null
    }
  });

  getAjaxRequest().then(function (request) {
    testHeaderValue(request.requestHeaders, 'Content-Type', null);
    done();
  });
});

๋‚˜๋„์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
'๊ณตํ†ต'์—์„œ '์Šน์ธ' ํ—ค๋”๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ axios.defaults.header์—์„œ ์†์„ฑ์„ ์‚ญ์ œํ•˜๊ณ  ์š”์ฒญํ•œ ๋‹ค์Œ ์†์„ฑ์„ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ.
๋•Œ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค ์ด ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค

์ด๊ฒƒ์€ ๋˜ํ•œ ๋‚˜์—๊ฒŒ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(axios v0.14.0 ์‚ฌ์šฉ). ํŠนํžˆ Access-Control-Allow-Headers ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ์˜ ๊ฒฝ์šฐ ์ด ๊ฒฝ์šฐ ํŠน์ • ํ—ค๋”๊ฐ€ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†ก๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฒ„์ „ 15.2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์–ธ์ œ

headers: {
      'Content-Type': null
    }

ํ—ค๋” ๊ฐ’์„ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ—ค๋” ์ด๋ฆ„์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด s3๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฒ„ํ‚ท์— ํŒŒ์ผ์„ ๊ฒŒ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์„œ๋ช…๋œ URL์„ ์ƒ์„ฑํ•  ๋•Œ Authenticate ํ—ค๋”๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์š”์ฒญ์— ๋‚ด API๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ๊ถŒํ•œ ๋ถ€์—ฌ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    var instance = axios.create();
    instance.defaults.headers.common = {};

    instance.put(signedUrl, file, {headers: {'Content-Type': file.type}})
        .then(function (result) {
            console.log(result);
        })
        .catch(function (err) {
            console.log(err);
        });

ํŽธ์ง‘: ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ํ—ค๋”๋ฅผ ์ง€์šธ ๋•Œ

instance.defaults.headers.common = {};

๊ธ€๋กœ๋ฒŒ ์ˆ˜์ค€์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ์šฉ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๊ทธ์•„์›ƒ๋ฉ๋‹ˆ๋‹ค.

์ „์—ญ ๊ตฌ์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ชจ๋“  ํ˜ธ์ถœ์— ํ•„์š”ํ•œ ํ—ค๋”๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

545

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋‹ค์Œ์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

delete axios.defaults.headers.common["Authorization"]; // or which ever header you have to remove

@SepiaGroup๊ณผ ๊ฐ™์€ ์ •ํ™•ํ•œ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
null ๋ฐ '' ๋กœ ๋ฎ์–ด์“ฐ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ AWS์—์„œ null ๋ฅผ ๋‚ด ๊ถŒํ•œ์œผ๋กœ ๋ณด๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.
์ธ์Šคํ„ด์Šค์—์„œ ์‚ญ์ œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‚ด ๊ถŒํ•œ ๋ถ€์—ฌ๊ฐ€ ์ „์—ญ์ ์œผ๋กœ ์‚ญ์ œ๋˜์–ด ๋‚ด ์„œ๋ฒ„์—์„œ 403์„ ์–ป์Šต๋‹ˆ๋‹ค.

๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ด์ „ XHR ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์Šฌํ”„๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

+1 ๋˜ํ•œ ํŠน์ • ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ํ—ค๋”๋ฅผ ์ง€์šธ ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

+1

+1

์ตœ์‹  ๋ฒ„์ „(0.16.2)์—์„œ๋„ ์ด ๋™์ž‘์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์Šฌํ””์ด ์ด์–ด์ง‘๋‹ˆ๋‹ค :(

๊ทธ๋ƒฅ ์‚ญ์ œ

delete instance.defaults.headers.common.Authorization
````

the way below is not working.
----
I think we could create a logout method that recreate the axios instance to replace the old one.

์ธ์Šคํ„ด์Šค = axios.create({์˜ต์…˜})

ํ•จ์ˆ˜: ๋กœ๊ทธ์•„์›ƒ() {
์ธ์Šคํ„ด์Šค = axios.create({์˜ต์…˜})
}
```

@lzp4ever ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ž‘๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์š”์ฒญ ๋ฐ ์‘๋‹ต ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ ๊ตฌ์„ฑ ์˜ต์…˜์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ ์ด์ƒ์œผ๋กœ ๋” ๋งŽ์€ ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ์š”?

@axelgenus ์˜ ์†”๋ฃจ์…˜์ด ๋” ๊นจ๋—ํ•˜๊ณ  ํŠน์ • ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋Š” ์ „์ฒด Axios ์ธ์Šคํ„ด์Šค์˜ "์žฌ์„ค์ •"์ด ๋œ

์†์„ฑ์„ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ํ—ค๋”๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :)

+1

+1

+1. ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ํ—ค๋”๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์Šฌํ”ˆ ์ผ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ์ „์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

+1

+1

+1 ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š”.

+1

+1

+1

์šฐ๋ฆฌ๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ๋ด‰์ฐฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ตฌ์ถ•ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋ŸฐํŠธ ์—”๋“œ ์•ฑ์€ ์—ฌ๋Ÿฌ Rest ์›น ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ํ—ค๋”๋ฅผ ์„ ํƒ ํ•ด์ œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

+1

+1

ํ—ค๋”, ๋ฐ์ดํ„ฐ ๋ฐ ๋ฉ”์†Œ๋“œ์™€ ํ•จ๊ป˜ ํŠน์ • ์š”์ฒญ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.
transformRequest(data, headers) { delete headers.common.Authorization; return data; }

์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๋ฉด ๋‚ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์‚ญ์ œ axios.defaults.headers.common["์Šน์ธ"]; // ๊ทธ๋ฆฌ๊ณ  ์ž์‹ ๋งŒ์˜ ํ—ค๋”๋ฅผ ์ƒ์„ฑ

@mukeshyadav ํ•ด๋‹น ์†”๋ฃจ์…˜์€ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋” ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์š”์ ์€ ์ด๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ์ด์ƒ์ ์ธ ์†”๋ฃจ์…˜์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Axios ์ธ์Šคํ„ด์Šค์— ์‚ฌ์šฉ์ž ์ •์˜ ์š”์ฒญ/์‘๋‹ต ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ—ค๋”๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ํŠน์ • ์š”์ฒญ์ด ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ํ—ค๋”๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์Œ์— ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ, ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ๊ฒŒ Axios ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ผํšŒ์„ฑ ์‚ฌ๋ก€์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

+1

transformRequest: [(data, headers) => {
    delete headers.common.Authorization
    return data
}]

๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™

@aaronatmycujoo ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์„น์‹œํ•œ ์†”๋ฃจ์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฌํ•œ ํ—ค๋”๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์ฒด์ธ์˜ ์ƒ์œ„ Axios ์ธ์Šคํ„ด์Šค์—์„œ ํ—ค๋”๊ฐ€ ์ œ๊ฑฐ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. headers ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ด‰๋ฐœํ•˜์ง€ ์•Š๋Š” ๊ทน๋‹จ์  ์ธ ๊ฒฝ์šฐ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ

@SepiaGroup ์š”์ฒญ ์ „์ฒด์— ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค... ์ด๋ ‡๊ฒŒ ํ•˜์„ธ์š”.

axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = โ€˜application/jsonโ€™;

๊ทธ๋ฆฌ๊ณ  ์š”์ฒญ ํ—ค๋”์—๋Š” 'application/json'๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

+1 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @axelgenus ur ์†”๋ฃจ์…˜์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค

+1

@aaronatmycujoo FTW!!! ๊ทธ์˜ ์†”๋ฃจ์…˜์€ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค ... ty!

S3์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค(ํ•˜๋‚˜์˜ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋งŒ ํ—ˆ์šฉ).
@SepiaGroup ์—์„œ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‹ค์Œ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ์ „์—ญ์ ์œผ๋กœ ์ธ์ฆ ํ—ค๋”๋„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.(
@aaronatmycujoo ์ด ์†”๋ฃจ์…˜์€ ์ €์—๊ฒŒ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰
๋‚ด ํ•˜๋ฃจ๋ฅผ ๊ตฌํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

+1

+1

+1

axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = โ€˜application/jsonโ€™;

๋‚˜๋ฅผ ์œ„ํ•ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ์ง€์‹์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋Š” "๊ธˆ์ง€๋œ ํ—ค๋”" ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Accept-Charset
  • Accept-Encoding
  • Access-Control-Request-Headers
  • Access-Control-Request-Method
  • Connection
  • Content-Length
  • Cookie
  • Cookie2
  • Date
  • DNT
  • Expect
  • Host
  • Keep-Alive
  • Origin
  • Referer
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • Via

์˜ค๋ฅ˜

TypeError: ์ •์˜๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ null์„ ๊ฐœ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

delete axios.defaults.headers.cummon["Authorization"];

@putu-eka-mulyana ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•˜๊ธฐ์— ์ž˜๋ชป๋œ ๊ณณ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

delete axios.defaults.headers.common["Authorization"];

+1, ์ฝ˜ํ…์ธ  ์œ ํ˜•์—์„œ ๋ฌธ์ž ์ง‘ํ•ฉ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

+1, ๋‹จ ํ•˜๋‚˜์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ์ฆ ํ—ค๋” ์ œ๊ฑฐ, ๋ช…์‹œ์ ์œผ๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์š”์ฒญ ๊ตฌ์„ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋‹จ์ง€ undefined ๋˜๋Š” null๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

+1, ๋‹จ ํ•˜๋‚˜์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ์ฆ ํ—ค๋” ์ œ๊ฑฐ, ๋ช…์‹œ์ ์œผ๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์š”์ฒญ ๊ตฌ์„ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋‹จ์ง€ undefined ๋˜๋Š” null๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด PUT ์š”์ฒญ ์ „์— OPTION ์š”์ฒญ์ด ์žˆ์œผ๋ฏ€๋กœ @aaronatmycujoo ์˜ transformRequest ์†”๋ฃจ์…˜์ด ๋‚ด OPTION ์š”์ฒญ์— ๋Œ€ํ•ด ์ž‘๋™ํ–ˆ์ง€๋งŒ Authorization ํ—ค๋”๋Š” ์—ฌ์ „ํžˆ ๋‚ด PUT ์š”์ฒญ์— ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ ๋‚ด ์ธ์ฆ ํ—ค๋”๊ฐ€ ์ธ์ฆ ์ธ์Šคํ„ด์Šค์—๋งŒ ์ ์šฉ๋˜๋„๋ก ์ธ์ฆ ๋Œ€ ๊ณต๊ฐœ ์š”์ฒญ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

// do not configure auth header
export const publicAxios = axios.create(...)

// configure auth header
export const authAxios = axios.create(...)

// no auth header present for public instance
publicAxios.put(...)

@rizen PR @codeclown์— ์˜ํ•ด # 1845 ์ „๋‹ฌํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ํ—ค๋”๋ฅผ ํ—ˆ์šฉ ๊ฒƒ์ด๋‹ค null . ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

@rizen PR @codeclown์— ์˜ํ•ด # 1845 ์ „๋‹ฌํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ํ—ค๋”๋ฅผ ํ—ˆ์šฉ ๊ฒƒ์ด๋‹ค null . ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

๋„ค

์ •๋ง ๊ธด ์—ฌ์ •์ž…๋‹ˆ๋‹ค. #1845๊ฐ€ ํ•˜๋ฃจ ๋นจ๋ฆฌ ๋ณ‘ํ•ฉ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

transformRequest: [(data, headers) => {
    delete headers.common.Authorization
    return data
}]

axios ๋ฌธ์„œ์—์„œ:

> ์š”์ฒญ ๋ฉ”์†Œ๋“œ 'PUT', 'POST', 'PATCH' ๋ฐ 'DELETE'์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์†Œ ๋น„์Šทํ•œ ์ƒํ™ฉ์— ์ฒ˜ํ•ด ์žˆ์ง€๋งŒ GET ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ—ค๋”๊ฐ€ Authorization: Bearer mytoken GET http://www.saasserviceprovider.com/notpublicapi
  1. AWS S3 ์—”๋“œํฌ์ธํŠธ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋””๋ ‰์…˜ URL์— X-Amz-Signature=blahblahblah ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  2. AWS S3๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ธ์ฆ์œผ๋กœ ์ธํ•ด ํ˜ธ์ถœ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

    • ํ—ค๋”: Authorization bearer token
    • ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด: X-Amz-Signature=blahblahblah

transformRequest , transformResponse , axios.interceptors.request , axios.interceptors.response ๋‘˜ ๋‹ค ๋‚ด๊ฐ€ ํ”„๋กœ์„ธ์Šค์— ์ž์‹ ์„ ์ฃผ์ž…ํ•˜๊ณ  ์Šน์ธ ํ—ค๋”๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. AWS S3๋กœ ๋ฆฌ๋””๋ ‰์…˜ - ๋ฆฌ๋””๋ ‰์…˜ ํ›„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด delete headers.Authorization ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ฒญ api/postman/etc์™€ ๋™์ผํ•œ ํ˜ธ์ถœ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

"ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•":

์ด๊ฒƒ์€ ์ถ”์•…ํ•˜๊ณ  ๋น„ํšจ์œจ์ ์ธ ์ŠคํŒ€ POS์ด์ง€๋งŒ... "์ž‘๋™"ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ VC ํŽ€๋”ฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‚˜์š”?

  let retry = false;
  await axios({
    method: 'get',
    url: "http://www.saasserviceprovider.com/notpublicapi",
    headers: {
      'Authorization': "Bearer mytoken",
    }
  })
  .then((r) => {
    //return successful
  })
  .catch ((e) => {
    if (e.request.res.responseUrl.match(/s3.amazonaws.com/)) {
      retry = e.request.res.responseUrl;
    } else {
          //log error
    }
  })

  //Retry
  if (retry) {
    await axios.get(retry)
    .then((r) => {
        //return successful
      }
    })
    .catch((e) => {
       //log error
    })
  }

์ง„์‹ฌ์œผ๋กœ ... ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (axios ๋‚ด์—์„œ)

๋‚˜๋Š” ๋‹ค์†Œ ๋น„์Šทํ•œ ์ƒํ™ฉ์— ์ฒ˜ํ•ด ์žˆ์ง€๋งŒ GET ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ—ค๋”๊ฐ€ Authorization: Bearer mytoken GET http://www.saasserviceprovider.com/notpublicapi
  2. AWS S3 ์—”๋“œํฌ์ธํŠธ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋””๋ ‰์…˜ URL์— X-Amz-Signature=blahblahblah ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  3. AWS S3๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ธ์ฆ์œผ๋กœ ์ธํ•ด ํ˜ธ์ถœ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํ—ค๋”: Authorization bearer token
  • ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด: X-Amz-Signature=blahblahblah

transformRequest , transformResponse , axios.interceptors.request , axios.interceptors.response ๋‘˜ ๋‹ค ๋‚ด๊ฐ€ ํ”„๋กœ์„ธ์Šค์— ์ž์‹ ์„ ์ฃผ์ž…ํ•˜๊ณ  ์Šน์ธ ํ—ค๋”๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. AWS S3๋กœ ๋ฆฌ๋””๋ ‰์…˜ - ๋ฆฌ๋””๋ ‰์…˜ ํ›„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด delete headers.Authorization ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ฒญ api/postman/etc์™€ ๋™์ผํ•œ ํ˜ธ์ถœ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ง„์‹ฌ์œผ๋กœ ... ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (axios ๋‚ด์—์„œ)

@iyerusad ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ๋Š”๋ฐ, ๊ทธ ํ›„์† ์กฐ์น˜/๋ฆฌ๋””๋ ‰ํŠธ ์š”์ฒญ(์ด ๊ฒฝ์šฐ ์•„๋งˆ์กด์œผ๋กœ)์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฆฌ๋””๋ ‰์…˜์„ ๊ฐ€๋กœ์ฑ„๊ณ  Authorization ํ—ค๋”๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์•„ ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค”

@iyerusad ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ๋Š”๋ฐ, ๊ทธ ํ›„์† ์กฐ์น˜/๋ฆฌ๋””๋ ‰ํŠธ ์š”์ฒญ(์ด ๊ฒฝ์šฐ ์•„๋งˆ์กด์œผ๋กœ)์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฆฌ๋””๋ ‰์…˜์„ ๊ฐ€๋กœ์ฑ„๊ณ  Authorization ํ—ค๋”๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์•„ ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค”

์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ์˜ต์…˜ B ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

_๋‚ด๊ฐ€ ํ‰๊ฐ€ํ•œ ์˜ต์…˜:_
A. ๋Œ€์ฒด ๋ž˜ํผ/ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ฑ„ํƒํ•˜์‹ญ์‹œ์˜ค(์˜ˆ: fetch api? ์š”์ฒญ? ์š”์ฒญ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ถ„๋ช…ํžˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ). ์ด๊ฒƒ์€ ๊ฐ€์žฅ ๊น”๋”ํ•œ ์˜ต์…˜์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ http ํด๋ผ์ด์–ธํŠธ ๊ตฌ๋ฌธ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

B. ๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ํ•จ์ˆ˜๋กœ ๋ž˜ํ•‘ํ•˜๊ณ  ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด๊ธฐ์—๋Š” ๋œ ํšจ์œจ์ ์ด์ง€๋งŒ ํ˜„์žฌ๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

C. ๋‚ด๊ฐ€ ๋ฐ”๋ณด์ด๊ณ  axios๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  axios์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

D. Axios๊ฐ€ ์ˆ˜์ •/ํŒจ์น˜๋ฅผ ์–ป์Šต๋‹ˆ๊นŒ?

@mikhoq @iyerusad ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ์™€ โ€‹โ€‹๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— #2844์—์„œ ์ˆ˜์ •๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค - #2855๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

@mikhoq ๊ณต๊ฐœ ๋ณต์ œ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๊ธฐ์— ์˜๊ฒฌ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

๊ทธ๋ ‡๋‹ค๋ฉด GET ์š”์ฒญ์— ๋Œ€ํ•ด transformRequest ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋…ธ๋ ฅ ์ด ํ•˜๊ณ  ์ผ, ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ํ˜„์žฌ ์š”์ฒญ์— ๋Œ€ํ•œ ํ—ค๋”๋ฅผ ์‚ญ์ œ.

transformRequest: [(data, headers) => {
    delete headers.common.Authorization
    return data
}]

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์„œ๋Š” ๋งํ•œ๋‹ค

// transformRequest ๋Š” ์š”์ฒญ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜๊ธฐ ์ „์— ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
// ์ด๊ฒƒ์€ 'PUT', 'POST', 'PATCH' ๋ฐ 'DELETE' ์š”์ฒญ ๋ฉ”์†Œ๋“œ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

transformRequest GET ์š”์ฒญ์— ๋Œ€ํ•ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์„ ์€ ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ์š”?

"์ด๊ฒƒ์€ 'PUT', 'POST', 'PATCH' ๋ฐ 'DELETE' ์š”์ฒญ ๋ฉ”์„œ๋“œ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค."

์•„๋งˆ๋„ "์ด๊ฒƒ์€ ์ž ์žฌ์ ์œผ๋กœ ....์—๋งŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค." ....? ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:
ํ—ค๋”: {
'์ฝ˜ํ…์ธ  ์œ ํ˜•': '์‘์šฉ ํ”„๋กœ๊ทธ๋žจ/json',
'๊ถŒํ•œ ๋ถ€์—ฌ': null,
}

{ headers: { 'Content-Type' = null } } ์„ค์ •์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ @axelgenus ๋„์›€์ด ๋˜๋Š” ์ฝ”๋ฉ˜ํŠธ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์กฐ๊ธˆ ๋” ๋‚˜์•„๊ฐ€์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

import Axios from 'axios'
const client = Axios.create({
  // ...
  transformRequest: [(data, headers) => {
    // add required "Content-Type" whenever body is defined
    if (data) headers['Content-Type'] = 'application/x-www-form-urlencoded'
    return data
  }],
})
// completely remove "Content-Type" from instance by default
delete client.defaults.headers.common['Content-Type']
delete client.defaults.headers.post['Content-Type']
delete client.defaults.headers.put['Content-Type']
delete client.defaults.headers.patch['Content-Type']
// ...

์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” Bitstamp API V2 ์ธ์ฆ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์š”์ฒญ ๊ณ„์ธต์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰