ํค๋๊ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ๊ฐ๋ณ ์์ฒญ์์ ํค๋๋ฅผ ๊ฑด๋๋ธ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. null
๋๋ undefined
์ค์ ํด๋ ์๋ฌด ํจ๊ณผ๊ฐ ์์ต๋๋ค.
๊ทธ ๋์์ ๋ณด์ฌ์ฃผ๋ ๋ช ๊ฐ์ง ์ฝ๋ ์์ ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ์ด๋ค ๊ธฐ๋ณธ ํค๋๋ฅผ ์ค์ ํด์ ํ๋ ค๊ณ ํฉ๋๊น?
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 = {};
๊ธ๋ก๋ฒ ์์ค์์ ์ ๊ฑฐํฉ๋๋ค. ์ธ์ฆ์ฉ ํค๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๊ทธ์์๋ฉ๋๋ค.
์ ์ญ ๊ตฌ์ฑ์ ์ฒ๋ฆฌํ๋ ๋ ๋์ ๋ฐฉ๋ฒ์ด ์์ ๋๊น์ง ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ชจ๋ ํธ์ถ์ ํ์ํ ํค๋๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด ์ด์์ ์ด์ง ์์ต๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์์ง๋ง ๋ค์์ผ๋ก ํด๊ฒฐ๋์์ต๋๋ค.
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 ๋ฌธ์์์:
๋๋ ๋ค์ ๋น์ทํ ์ํฉ์ ์ฒํด ์์ง๋ง GET ์์ฒญ์ด ์์ต๋๋ค.
Authorization: Bearer mytoken
GET http://www.saasserviceprovider.com/notpublicapiAWS S3 ์๋ํฌ์ธํธ๋ก ๋ฆฌ๋๋ ์
ํฉ๋๋ค. ๋ฆฌ๋๋ ์
URL์ X-Amz-Signature=blahblahblah
์ฟผ๋ฆฌ ๋ฌธ์์ด์ด ์ถ๊ฐ๋์์ต๋๋ค.
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 ์์ฒญ์ด ์์ต๋๋ค.
- ํค๋๊ฐ
Authorization: Bearer mytoken
GET http://www.saasserviceprovider.com/notpublicapi- AWS S3 ์๋ํฌ์ธํธ๋ก ๋ฆฌ๋๋ ์ ํฉ๋๋ค. ๋ฆฌ๋๋ ์ URL์
X-Amz-Signature=blahblahblah
์ฟผ๋ฆฌ ๋ฌธ์์ด์ด ์ถ๊ฐ๋์์ต๋๋ค.- 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 ์ธ์ฆ ๋ฐฉ๋ฒ์ ๋ํ ์์ฒญ ๊ณ์ธต์ ๊ตฌํํ๋ ๊ฒ์ด์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ฅผ ์ํด ์๋