์ฝํ ์ธ ์ ํ์ด application/x-www-form-urlencoded์ธ ์์ฒญ์ ๋ณด๋ด์ญ์์ค.
var data = Querystring.stringify({
"grant_type": "password",
"username": login,
"password": password
});
axios.post(Urls.login, data);
๊ทธ๋ฌ๋ ์์ฒญ์ ๊ทธ๋ฌํ ํค๋๊ฐ ์์ต๋๋ค.
๋๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ค๊ณ :
var data = Querystring.stringify({
"grant_type": "password",
"username": login,
"password": password
});
return axios({
method: 'post',
url: Urls.login,
data: data,
headers: {
'Content-type': 'application/x-www-form-urlencoded'
}
});
๊ฐ์ ๋ฌธ์
jquery ์ฝ๋๊ฐ ์ ์๋ํฉ๋๋ค.
$.ajax({
url: Urls.login,
data: data,
type: "POST",
headers: {
'Content-type': 'application/x-www-form-urlencoded'
}
});
axios๋ฅผ ์ฌ์ฉํ์ฌ ์ด ํค๋๋ก ์์ฒญ์ ๋ณด๋ด๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
๊ทธ๊ฒ์ ๋น์ ์ด ๋ณด์ฌ์ค๋๋ก ์๋ํด์ผํฉ๋๋ค. ๋ฒ๊ทธ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์กฐ์ฌํ ๊ฒ์ด๋ค.
์์ธ์ ์ธํฐ์ ํฐ์ ๋๋ค. ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํ ๋๋ง ํด๋น Content-Type์ผ๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
๋ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
axios.interceptors.request.use(function (config) {
var token = LoginStore.getJwt();
if (token) {
config.headers["Authorization"] = "Bearer " + token;
}
return config;
}, function (error) {
return Promise.reject(error);
});
์ธํฐ์
ํฐ ๋ด๋ถ์์ 'Content-Type' ํค๋๋ฅผ ๋ณผ ์ ์์ง๋ง ์๋ฒ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
์ธํฐ์
ํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Axios๋ ๋ด๊ฐ ์ค์ ํ ํค๋๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
์ด๊ฒ์ด ๋ฒ์ธ์ธ ๊ฒ ๊ฐ์ต๋๋ค โ https://github.com/mzabriskie/axios/blob/master/lib/adapters/xhr.js#L117
์์ฒญ์ด ์ ์ก๋๊ธฐ ์ ์ Content-Type
ํค๋๊ฐ ์ ๊ฑฐ๋ ์ด์ ๋ฅผ ์๊ณ ์์ต๋๊น?
ํด๊ฒฐ ๋ฐฉ๋ฒ์ axios ์์ฒญ์ ํ ๋ data
๋ฅผ data || {}
๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋ฐ์ดํฐ๊ฐ ์ ์๋์ง ์์๋์ง ํ์ธํฉ๋๋ค.
requestData
๊ฐ undefined
$์ผ ๋ $ Content-Type
๋ฅผ ์ ๊ฑฐํ๋ ๋
ผ๋ฆฌ๊ฐ ์ด ์ปค๋ฐ https://github.com/mzabriskie/axios/commit/9096d34186d5a5148f06c07854b21d6cc8035e96์ ๋ค์ด์จ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ถ๊ฐ๋์๋์ง์ ๋ํ ํ์๋ ์์ต๋๋ค.
requestData
๊ฐ undefined
์ด๊ณ ๋ฐฉ๋ฒ์ด PUT
, POST
๋๋ PATCH
์ด๊ณ Content-Type
๊ฐ ์๋ ๊ฒฝ์ฐ ํฌํํ๊ฒ ์ต๋๋ค. ์ค์ ํ ๋ค์ ๊ธฐ๋ณธ๊ฐ Content-Type
์ application/x-www-form-urlencoded
๋ก ์ค์ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ง์ ๋ ๊ฒ์ ์กด์คํ์ญ์์ค.
@mzabriskie ํ์ง๋ง @alborozd ๊ฐ ์ ๊ณตํ ์ฝ๋ ์ค๋ํซ์์ data
๊ฐ Querystring.stringify({...})
๋ก ์ค์ ๋์ด ์์ผ๋ฏ๋ก requestData
๊ฐ undefined
$ ๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค.
@mzabriskie ๋น์ ์ด ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ฒญ ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํ ๋ ํผ๋ค๋ฌ๋ ๋ฐ์ดํฐ๊ฐ ๋น์ด ์์์ ๋ณด์ฌ์ค๋๋ค. ์ธํฐ์ ํฐ๊ฐ ์์ผ๋ฉด ๋ฐ์ดํฐ์ ํค๋๋ฅผ ๋ณผ ์ ์์ผ๋ฉฐ ์ ์๋ํฉ๋๋ค.
๋ฐ๋ผ์ ์ธํฐ์ ํฐ๋ก ์์ ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด ๊ฒ์ ์ถฉ๋์ํค๋ ๋ฐ ์ธํฐ์
ํฐ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ฝํ
์ธ ์ ํ ํค๋ ๊ธฐ๋ณธ๊ฐ์ axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
์ค์ ํ์ผ๋ฉฐ POST ๋ณธ๋ฌธ์ ํ์ด๋ก๋๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
URLSearchParams๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
var params = new URLSearchParams();
params.append('email', email);
return (dispatch) => {
axios.post('/stack/' + uri, params)
๊ทธ๋ฌ๋ ์ด๊ฒ์ Safari ๋ฐ IE์์ ์ง์๋์ง ์์ต๋๋ค.
ํธ์ง: ์ข์ต๋๋ค :) ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ๋ค์ ์
๋ฐ์ดํธ์
๋๋ค. ์ง์๋๋ ์ ์ฒด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌ ๋ฌธ์์ด๋ก ๋ณด๋ด๋ ๊ฒ์
๋๋ค.
data: "flashcard=" + JSON.stringify(flashcard) + "&stackUri=" + stackUri
. ์ํ์ง๋ง ํจ๊ณผ๊ฐ ์๋ค ๐
๋์ qs์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
var qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 });
์ด๊ฒ์ ํด๊ฒฐ์ฑ
์ด ์๋๋๋ค. "Querystring"
๋๋ "qs"
๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฐจ์ด์ ์ ๋ฌด์์
๋๊น? ๋ฌธ์ ๋ ์ธํฐ์
ํฐ ๋๋ฌธ์ ['Content-Type'] = 'application/x-www-form-urlencoded'
ํค๋๊ฐ ๋น์ด ์๋ค๋ ๊ฒ์
๋๋ค.
์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ๋ด POST๊ฐ API์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ์ด์ ๋ฅผ ์กฐ์ฌํ๋ ๋ฐ ์ค๋ 1์๊ฐ์ ์์๊ธฐ ๋๋ฌธ์(ํด๋น ๋ฌธ์ ์ ๋ํด ์๊ธฐํ ๋๊น์ง)... ์๋๋ฉด ์์ ํ ๊ณํ์ด ์๊ณ ๋ค๋ฅธ ๊ณณ์ผ๋ก ๊ฐ๋ ๊ฒ์ด ๋ ๋ซ์ต๋๊น?
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค ... ์ฌ์ ํ ์์ ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค ...
์ด๊ฒ์ ์๋ฃจ์ ์ผ๋ก ํด๊ฒฐ ๋์ง ์์ผ๋ฏ๋ก @nickuraltsev ๋ฅผ ๋ค์ ์ฌ์ญ์์ค.
๋ฌธ์ ์ ๋ํด +1.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด q ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋๋ฅผ ์ํด ์ ์๋ํฉ๋๋ค.
import qs from 'qs';
axios.interceptors.request.use((request) => {
if (request.data && request.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
request.data = qs.stringify(request.data);
}
return request;
});
๋ฌธ์ ์ ๋ํด +1.
hyanmandian์ด 14์๊ฐ ์ ์ ๋๊ธ์ ๋จ๊ฒผ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด q ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋๋ฅผ ์ํด ์ ์๋ํฉ๋๋ค.
ํ๋ฅญํ์ง๋ง ๋ค๋ฅธ ๊ฒ์ ์ค์นํ์ฌ IMHO ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
๊ตฌ์ฑ์ data: {}
๋ฅผ ์ถ๊ฐํ๋ฉด ์ธํฐ์
ํฐ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ง์ ํ ํค๋๋ฅผ ๊ฑด๋๋ฐ์ง ์์ต๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ํ ์ผ์ด๋ฉฐ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
import request from 'axios'
export const playSound = (soundFile) => (dispatch) => {
dispatch(playSoundPending());
return request
.get(`/play/audio/${soundFile}`, { headers: {'Content-Type': 'audio/x-wav'}, data: {} })
.then(response => response.data)
});
};
์ด๊ฒ์ ๋คํธ์ํฌ ํญ์ ์์ฒญ ํค๋์์ Content-Type
๋ฅผ application/json
์์ audio/x-wav
๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
์์ง ํด๊ฒฐ๋์ง ์์๋์? ์ฌ๊ธฐ์ ๊ฒ์๋ ์๋ฃจ์ ์ผ๋ก ๋ด ์ฝํ ์ธ ์ ํ์ ์ค์ ํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋์์ด ๋์ จ๋์?
๋๋ encodeURIComponent ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ ์ getToken(์ฌ์ฉ์ ์ด๋ฆ, ์ํธ) {
๋ฐํ ์ถ({
๋ฐฉ๋ฒ: '๊ฒ์',
url: '์ข
์ ',
๋ฐ์ดํฐ: Username=${**encodeURIComponent**(username)}&
password=${**encodeURIComponent**(password)}&
Grant_type=password
})
์ถฉ๋. ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ฉด ํญ์ ์กด์ค๋ ๊ฒ์ด๋ผ๊ณ ํ์คํ ๊ฐ์ ํฉ๋๋ค. Axios๋ ํน์ ์ํฉ์์ ๊ธฐ๋ณธ๊ฐ์ ํ์คํ ๋ฌด์ํ์ฌ ๊ฐ๋ํ ์ฌ๋๋ค์๊ฒ ๋ฌธ์ ๋ฅผ ์ผ์ผํต๋๋ค.
์ด๊ฒ์ด ๋ฐ์ํ ๋ ๊ตฌ์ฒด์ ์ธ ๋ณํฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://github.com/mzabriskie/axios/pull/195/files
์ด ๋ฌธ์ ์ ๋ํด +1์
๋๋ค.
๋ด Tomcat ๊ตฌ์ฑ์ ๋ฌด์์ด ์๋ชป๋์๋์ง ์์๋ด๋ ค๊ณ 3์๊ฐ ๋๊ฒ ๋ณด๋๊ณ ๋ถ๋ช
ํ ๋ด ํค๋๊ฐ ์๋ฒ๋ก ๊ฐ๋ ๋์ค์ ๋๋๋นํ ๊ฒ ๊ฐ์ต๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋์์ด ๋์ง ์์์ต๋๋ค. ํ๋๋์ด ํค๋๋ฅผ ์ ์ฅ!
@polyakoff ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ์ต๋๊น? ์๋๋ฉด ์ฌ์ ํ ๋งํ ์์ต๋๋ค. ๋ด๊ฐ ๊ด์ฐฐํ ๊ฒ์ ์ด ๋ฌธ์ ๊ฐ ๊ฐํ์ ์ผ๋ก ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
@usopan ์ฌ์ ํ ๋ถ์ด ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ด ํน์ ์์ฒญ์ ๋ํด isomorphic-fetch๋ก ์ด๋ํ์ต๋๋ค.
๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์๋ ์ ์์ ์ผ๋ก ์๋ํ๋ ๊ฒ ๊ฐ์ง๋ง ํน์ Safari ๋ฒ์ ์์๋ ์ฌ์ ํ ์๋ํ์ง ์์ต๋๋ค.
๋๋ Safari๊ฐ ๋๋ฅผ ๋ง์น๊ณ ์๋ค๊ณ ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํด +1์ ๋๋ค.
ํด๊ฒฐ์ฑ
์ ์ฐพ์์ต๋๋ค. ํด๊ฒฐ์ฑ
์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ฐ์งํ๋ ๊ฒ์
๋๋ค.
Chrome์์ - https://github.com/ljharb/qs ๋ฅผ ์ฌ์ฉํ์ฌ json ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ Content-Type ํค๋๋ฅผ ์ค์ ํฉ๋๋ค.
Safari์์ - FormData๋ฅผ ๋ณธ๋ฌธ์ผ๋ก ์ฌ์ฉํ๊ณ Content-Type ํค๋๋ฅผ ์ค์ ํ์ง ๋ง์ญ์์ค.
์ด๋ฐ ๋ฌธ์ ๊ฐ ์ด๋ป๊ฒ ๋ฐ๋ ๋๊ฒ ํด๊ฒฐ๋์ง ์๋์ง ์์๋ ํ ์ ์์ต๋๋ค.
์์ฐ ์ข์ ๋ฌธ์ ! ์์ง ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋คโ๏ธ
์ง์ฆ๋๋ค.
์ง์ฆ๋๋ค + 1
+1
+1
+1
+1
+1
+1
+1
+1
+1
const ์ฟผ๋ฆฌ ๋ฌธ์์ด = ์๊ตฌ('์ฟผ๋ฆฌ ๋ฌธ์์ด');
๋ก๊ทธ์ธ(){
var _this = ์ด๊ฒ;
this.$http({
URL: URL,
๋ฐฉ๋ฒ: '๊ฒ์',
๋ฐ์ดํฐ: querystring.stringify({
์ด๋ฉ์ผ: ์ด๋ฉ์ผ,
๋น๋ฐ๋ฒํธ: ํจ์ค
}),
ํค๋: {
'์ฝํ
์ธ ์ ํ': '์์ฉ ํ๋ก๊ทธ๋จ/x-www-form-urlencoded'
}
}).then(ํจ์(์๋ต) {
console.log(์๋ต);
}).catch(ํจ์(์ค๋ฅ) {
console.log(์ค๋ฅ);
});
}
+1
+1
+1
์์ฝํ์๋ฉด Content-Type: application/x-www-form-urlencoded
๋ก ๋ณด๋ธ ๋ชจ๋ ์์ฒญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํค๋๊ฐ ์ค์ ๋๋๋ก data: {}
๋ฅผ ์ค์ ํ๊ณ ์๋์ผ๋ก ์์ฒญ ๋ฐ์ดํฐ ํ์ด๋ก๋๋ฅผ ์ธ์ฝ๋ฉํฉ๋๋ค.
๋ด ์ฝ๋๋ฅผ ๊ณต์ ํ๊ณ ์์ต๋๋ค.
import qs from 'qs'
...
const instance = axios.create({
baseURL: config.api.host,
responseType: config.api.responseType,
timeout: config.api.timeout,
data: {},
})
instance.interceptors.request.use((req) => {
if (req.method === 'post') {
req.headers['Content-Type'] = config.api.defaults.postContentType
req.data = qs.stringify(req.data)
}
return req
}, (error) => Promise.reject(error))
์ด๊ฒ์ ๋๋ฅผ ์ํด ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ! ์์ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ ๋ถ์ ๋ฐฉ๋ฒ์ผ๋ก ํฌํฌ๋ฅผ ๋ง๋ค๊ณ ์๋ฃจ์ ์ ์ ๊ณตํด์ผ ํ๋์ง ๊ถ๊ธํฉ๋๋ค. ์ฐฝ์์์๊ฒ ์ข์ 'ํจํด'์ด ๋ ๊น์? @mzabriskie ๊ทธ๋ฐ ๊ฒ์ ํตํฉํ์๊ฒ ์ต๋๊น?
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ 3์๊ฐ ์ด์ ์์๋ฉ๋๋ค. @Maxwell2022 ์ํ ๋ฐ์ดํฐ๋ก ์ฝ๋๋ฅผ ์์ฑํด ์ฃผ์๊ฒ ์ต๋๊น?
+1
1
+1
@bsjaffer ์ฝ๋ ์ํ์ ๊ฒ์ํ์ต๋๋ค. ๋ค๋ฅธ ๋ฌด์์ ์ํ์ญ๋๊น?
@Maxwell2022 ์ง๊ธ์ ๊ด์ฐฎ์ต๋๋ค.
+1
+1
+1
+1
+1
+1
+1
++1
๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
let details = {
key1: 'data1',
key2: `data2`,
key3: `data3`,
};
var formBody = [];
for (var property in details) {
var encodedKey = encodeURIComponent(property);
var encodedValue = encodeURIComponent(details[property]);
formBody.push(encodedKey + "=" + encodedValue);
}
formBody = formBody.join("&");
const URL = `PUT-YOUR-API-URL-OVER-HERE`;
return axios({
method: 'POST',
url: URL,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data: formBody,
})
.then(res => res.data)
.catch(error => { throw error });
+1
์, ๋น์ ์ ๊ทธ๊ฒ์ ์ถ์ธกํ์ต๋๋ค, +1
+1
+1
+1, reznord์ ์๋ฃจ์
์ ๋ง๋ฒ์ ์ํํ์ต๋๋ค( ํค๋์ ํจ๊ป ๋ฐ์ดํฐ ์ค์ ).
const config = { headers: { 'Content-Type': 'multipart/form-data' }, data: {} };
@bruddah ๋ฉ์ ธ์, ํจ๊ณผ๊ฐ ์์ด์ ๊ธฐ์ฉ๋๋ค.
_FastHub๋ฅผ ์ฌ์ฉํ์ฌ ๋ด OnePlus ONEPLUS A3003์์ ์ ์ก _
+1
qs๋ฅผ ์ฌ์ฉํ๋ฉด ํจ๊ณผ์ ์ ๋๋ค!
React์์ ์ด๊ฒ์ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
import axios from 'axios';
import querystring from 'querystring';
const data = querystring.stringify({id:32, name:'john'});
axios.post('http://example.com/posturl', data)
๊ทธ ์ด์ ๋ axios๊ฐ ํฌ์คํธ ๋ฐ์ดํฐ๋ฅผ HTTP ์์ฒญ์ ๋ณธ๋ฌธ์ ์ถ๊ฐํ๊ธฐ ์ ์ ์๋์ผ๋ก ์ธ์ฝ๋ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ์ธ์ฝ๋ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๊ฒ์ด ์ฟผ๋ฆฌ ๋ฌธ์์ด์ด ํ๋ ์ผ์
๋๋ค. {id:32, name:'john'}
๋ฅผ ์ฌ์ฉํ๊ณ id=32&name=john
์ ๊ฐ์ ๊ฒ์ ์์ฑํ ๋ค์ axios๋ ์ด๋ฅผ ํฌ์คํธ ์์ฒญ์ ๋ณธ๋ฌธ์ผ๋ก ์ค์ ํฉ๋๋ค.
๋ค์ ์์ฒญ์ ํตํด ์ด๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
axios.post('http://example.com/posturl', 'id=32&name=john')
์์ ์ฝ๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ผ ํฉ๋๋ค.
์คํํ์ง 1๋ ์ด ๋์๋๋ฐ ์์ง๋ ๊ณ ์ณ์ง์ง๊ฐ ์๋ค์....
+1
+1
์๋ค ์! ๋น์ ์ ์ด๊ฒ์ ์๋ํ ์ ์์ต๋๋ค, ๊ทธ๊ฒ์ ์ ์๊ฒ ์ ์๋ํ์ง๋ง ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
get (url, data) {
return axios({
method: 'get',
url: url,
baseURL: 'http://xxxxx/api',
timeout: 10000,
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},//this is important !
data: data,//this is important !
params: data//this is important !
}).then(
(response) => {
console.log(response)
return checkStatus(response)
}
)
}
Patch ์์ฒญ์์ _Content-Type:application/json-patch+json_ ์ ๋ณด๋ด๋ ค๊ณ ํ๋ฉด( RFC6902 ์ ๋ฐ๋ฆ),
๋ค์์ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค (์์ฒญ ํค๋์ ์ฌ๋ฐ๋ฅธ ์ ํ์ด ์์ต๋๋ค).
axios.patch(
url,
data,
{ headers: { 'Content-Type': 'application/json-patch+json;charset=UTF-8' } }
))
์ธํฐ์ ํฐ๊ฐ ํค๋๋ฅผ ๋ฎ์ด์ฐ๋ฏ๋ก ์ด ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์ธํฐ์ ํฐ์์ ๋ค์์ ์ฌ์ฉํ์ญ์์ค.
config.header['yourheader'] = value;
๋์ ์
config.header = {'yourheader': value}
@DavidJiang7 ์๋ฃจ์ ์ด ์๋ํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค.
static register(token, email, lang)
{
let config = { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; // we do it to send SIMPLE post eequest (to avoid send CORS OPTIONS request before post)
let params = new URLSearchParams(); // and we cannot send json but params are transform to url-style
params.append('email', email);
params.append('lang', lang);
return axios.post(ENV.API_URL + '/device/' + token + '/register', params, config);
}
์ฌ๊ธฐ ์์ CORS ์ฌ๋ก๋ฅผ ๋ณด์ฌ์ฃผ๋ ํฅ๋ฏธ๋ก์ด ์ฌ์ง. SIMPLE ์์ฒญ์ ๋ณด๋ผ ๋ OPTIONS ์์ฒญ์ ์ ์ก๋์ง ์์ต๋๋ค. ๋จ์ ์์ฒญ์ GET, HEAD, POST์ด๊ณ 'content-type ' ํค๋๊ฐ application/x-www-form-urlencoded , multipart/form-data ๋๋ text/plain ๋ฐ ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ํค๋์ ๋์ผํ ์์ฒญ์ ๋๋ค.
๊ทธ๋ฅ ํด
const data = {name: 'my name'}
const form = 'data=' + JSON.stringify(data)
axios.post('/my_url', form)
์์ ๋จ
์คํ์ ๋ํด ์ฃ์กํฉ๋๋ค. ๋๋ ๋ช ๋ฌ ๋์ ์ด๊ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์๋ฒ์ data
๋งค๊ฐ๋ณ์๋ง ์๋ค๋ ๊ฒ์ ์์ด๋ฒ๋ ธ์ต๋๋ค.
...
$data = json_decode($_POST['data'], 1);
echo $data['name']; // my name
...
๊นจ๋ํ ์๋ฃจ์ ์ ์ํด ์ถฉ๋ํ๊ณ ๊ธฐ๊บผ์ด ๋์์ค๋๋ค.
@jesusantguerrero
๊ทธ๋ฅ ํด
const ๋ฐ์ดํฐ = {์ด๋ฆ: '๋ด ์ด๋ฆ'}
const ํ์ = '๋ฐ์ดํฐ=' + JSON.stringfy(๋ฐ์ดํฐ)
axios.post('/my_url', ์์)
์๋ํ์ง ์์ง๋ง JSON.stringify
^^ ์์ ์คํ์
๋๋ค.
Node.js๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ๋ ์ด๊ฒ์ด ์๋ํฉ๋๋ค. ์ค๋ ๋์ ๋ชจ๋ ์ฌ๋์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ ์ฌ๋๋ค์ ์๋ฃจ์ ์ ๊ฒฐํฉํ๊ณ Node.js ๋ฌธ์๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ์๊ฐํด๋ผ ์ ์๋ ๊ฐ์ฅ ๊นจ๋ํ ๊ฒ์ ๋๋ค.
import { URLSearchParams } from 'url';
async function auth() {
try {
const config = {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
};
const params = new URLSearchParams();
params.append('grant_type', 'client_credentials');
params.append('client_id', configuration.yelpClientId);
params.append('client_secret', configuration.yelpClientSecret);
const { data } = await axios.post(
YELP_AUTH_ENDPOINT,
params.toString(),
config,
);
return data;
} catch (error) {
console.log(error.response.data);
return {};
}
}
๋ฐ์ดํฐ ๋์ ๋งค๊ฐ๋ณ์ ์ฌ์ฉ
axios({
method: 'post',
url: '/my/api',
headers: {
'Content-type': 'application/x-www-form-urlencoded'
},
params: {
'grant_type': 'code',
'client_id': '1231453',
'client_secret': 'THIS_IS_THE_SECRET'
}
})
.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
}
);
@skuarch
๋ฐ์ดํฐ ๋์ ๋งค๊ฐ๋ณ์ ์ฌ์ฉ
๊ทธ๊ฒ์ด ์๋ํ๋ค๋ฉด ์ง๊ธ๊น์ง ๊ฐ์ฅ ๊นจ๋ํ ์๋ฃจ์ ์ ๋๋ค.
@oshalygin ๋งค๊ฐ๋ณ์๋ฅผ ์ฟผ๋ฆฌ ๋ฌธ์์ด๋ก ์ค์ ํ๊ณ ์ฌํ ๋ณ์๋ก ๋ณด๋ด์ง ์์ต๋๋ค.
๊ฐ๋จํ ์์์ ๊ฒ์ํ ์ ์๋ ajax ๋ผ์ด๋ธ๋ฌ๋ฆฌ? ์ง์ง?
1
๋๊ตฌ๋ content-type์ application/json์ผ๋ก ์ค์ ํด์ผ ํ๋ ์ฌ๋์ ์๊ณ ์์ต๋๋ค.
axios.post(`${DOMAIN}${url}`,params, {'headers': {"Content-Type": "application/json;charset=UTF-8"}})
์๋ํ์ง ์์ต๋๋ค.
@hellomrbigshot ์๋ง๋ CORS ๋ฌธ์ ์ผ ๊ฒ์ ๋๋ค(์ด ์ค๋ ๋์์๋ ์ด์ ๋ํด ์ฝ์ด๋ณด์ธ์)
Axios์ ๋ฒ๊ฑฐ๋ก์ด ์ฝ๋(URLSearchParams๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ์ด๋ก๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ์ ธ์ค๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
if (utils.isURLSearchParams(data)) {
setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
return data.toString();
}
if (utils.isObject(data)) {
setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
return JSON.stringify(data);
}
return data;
}
๋ฐ๋ผ์ data
๊ฐ URLSearchParam์ด ์๋ ๊ฐ์ฒด(๋๋ ์ด์ ์ ํ์ธ๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ ํ ์ค ํ๋ - FormData๊ฐ ๋ชฉ๋ก์ ์๊ณ ์์ ์ํ๋ก ์ฌ์ฉ๋จ)์ธ ๊ฒฝ์ฐ JSON.stringified๊ฐ ๋ฉ๋๋ค. ํค๋๊ฐ application/json์ผ๋ก ์ค์ ๋๋๋ก ํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ๋ฌธ์์ด์ ์ ๋ฌํ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉ๋๋ฏ๋ก adeelibr์ 7์ 4์ผ ์ฃผ์์ ๋์ ๋ด ์์ ๋ฐ์ดํฐ์ ์ ํฉํ ๊ฒ์
๋๋ค.
๊ธฐ๋ณธ ํค๋ ์ ํ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ด๊ฒ์ ํด๋ผ์ด์ธํธ ์ธก์ ๋ด vue + axios ์ฝ๋์
๋๋ค.
Vue.prototype.$http = axios;
new Vue({
el: '#root',
data: {
site_url: params.site_url,
name: '',
description: ''
},
methods:{
onSubmit(){
var url = this.site_url + 'project/create';
this.$http.post( url, {
name: this.name,
description: this.description
} ).then(
response => console.log(response.data)
);
}
},
mounted(){
}
});```
Here this.$http means axios. I using axios instead of vue resource.
My Server Side Code
if ( ์ธํธ( $_POST ) ) {
$fields_to_add = array( '์ด๋ฆ', '์ค๋ช
' );
$response = json_decode(file_get_contents("php://input"), true);
foreach ( $k => $v ๋ก์์ $response ) {
if( in_array($k, $fields_to_add) ){
$_POST[$k] = $v;
}
}
์์ฝ json_encode( $_POST );
์ถ๊ตฌ();
} ๋ ๋ค๋ฅธ{
echo json_encode( array( 'message' => '์๋ชป๋ ์์ฒญ' ) );
์ถ๊ตฌ();
}
```
ํ๋ ์ด๋ฆ์ ํ๋ ์ด๋ฆ ๋ชฉ๋ก์ผ๋ก ์
๋ ฅํฉ๋๋ค. ์๋์ผ๋ก ํฌ์คํธ๋ก ๋ณํ๋ฉ๋๋ค.
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค
+1
+1
+1
OMG ๐ฑ ์ผ๋ถ application/x-www-form-urlencoded ์์ ๋ฐ์ดํฐ์ ํจ๊ป POST ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด ์ด๋ ๊ฒ ๋ณต์กํ์ง ๋ชฐ๋์ต๋๋ค. README๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ค์ ์ฝ์ด์ผ ํ๋ฉฐ ๊ตฌ์ฑ์ ๋ฐ์ดํฐ ํ๋๋ฅผ qs.stringify() ๋ฐ params ํ๋์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ชป ์ดํดํ์ต๋๋ค.
ํ์ฌ๋ก์๋ ๋ค์๊ณผ ๊ฐ์ x-www-form-urlencoded ์์ ๋ฐ์ดํฐ ์ ์ก์ ์ง์ํ๋ ์ธ์คํด์ค ๋ฉ์๋๋ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
+1
ํด๊ฒฐ๋์ง ์์์ต๋๋ค!
๊ทธ๊ฒ์ ๋ง์น... ์์ํ ์ด๋ ค์์ต๋๋ค. ์์ request lib๋ ๊ทธ๊ฒ์ ์์ฃผ ๊ฐ๋จํ๊ฒ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋์์ต๋๋ค.
+1
+1
+1
๋ค์์ ์ด ์์
์ ์ํํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์
๋๋ค.
์ฐ์ ์ฌ๊ธฐ๋ฅผ ์ฝ์ด์ฃผ์ธ์: https://github.com/axios/axios#using -applicationx-www-form-urlencoded-format
์์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
npm์ผ๋ก ์ค์นํ๊ฑฐ๋ ์ฌ๊ธฐ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค. https://github.com/WebReflection/url-search-params/blob/master/build/url-search-params.js
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํ ๊ฒฝ์ฐ ํ์ผ์ ํฌํจํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
//For e.g. in your index.html,
<script src="url-search-params.js"></script>
var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params)
.then(function (response)
{
console.log(response.data);
})
.catch(function (error)
{
console.log(error);
});
๊ทธ๊ฒ์ ๋งค๋ ฅ์ฒ๋ผ ์๋ํฉ๋๋ค! :+1:
@aditya43 ๊ฐ์ฌํฉ๋๋ค!
์ค์ ๋ก ์ด๋ ๊ฒ ํ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ axios Github ํ์ด์ง์์ ์ง์ ๊ฐ์ ธ์จ ๊ฒ์ ๋๋ค. ์ธ์ฝ๋ฉ๋ URL์ ์ง์ ๋ง๋ค์ด์ผ ํ์ง๋ง ๋ฐฉ๊ธ ํ ์คํธํ๋๋ฐ ์๋ํฉ๋๋ค.
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
์ด ๋ฒ๊ทธ๋ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค. ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
@DZuz14 ์๋ํ๋๋ฐ ์๋ํ์ง ์์ต๋๋ค. axios ์ ์ญ์ ์ธ์คํด์ค๋ณ๋ก ์ฌ์ฉํ๊ณ ์๋ฌด๊ฒ๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.
ํ๋์ฝ๋ฉ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
+1
axios ์ง์ฆ๋, ๊ต์ฒด ์์ฒญ ์ฌ์ฉ
+1
์๋ ์ค์ ๋๋ค!
https://www.npmjs.com/package/form-data-urlencoded
import getFormData from 'form-data-urlencoded';
let data = getFormData({"_csrf": 'wrwrwrvwg4657rhed4hehe4',
"Res1[Test1]": "segf96767",
"Res2[Test2]": "hello"});
let options = {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' },
url: 'http://fhfhfhfh/455454545/fhfhfhf',
data
};
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
axios(options).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});
"Content-Type"์์ charset(UTF-8)์ ์ ์ํ๊ณ ์์ "interceptors" ์๋ฃจ์
์ ์์ ํ์ต๋๋ค.
๋ง์นจ๋ด ์๋ํฉ๋๋ค.
import axios from 'axios'
import qs from 'qs'
axios.interceptors.request.use((request) => {
if (request.data && (request.headers['Content-Type'].indexOf('application/x-www-form-urlencoded') !== -1)) {
request.data = qs.stringify(request.data)
}
return request
})
axios({
method: 'POST',
url,
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
},
data
}).then(() => {
// DO SOMETHING
})
๋๋ cors์ ๊ฒฝ์ฐ๋ง ๋ฐ๊ฒฌํ๋๋ฐ, ์ต์ ์์ฒญ ํค๋๋ฅผ ๋ณด๋ด๋ ๋ฐ ์คํจํ๋ฉด ํฌ๋ก์ค ๋๋ฉ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ , ๋ค์๋ ์์ ์ด ๊ตฌํ๋์ง ์์ต๋๋ค.
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
์ ๋ ๋๋ฃ ์ค ํ ๋ช ์ด ์ถ์ฒํด์ค์ axios๋ก ์์ํ๊ณ , ์ ๋ฅผ ์ํ ์ฒซ ๋ฒ์งธ ๋ ธ๋ ฅ์ ์๋ํ๋ API์์ ์ก์ธ์ค ํ ํฐ์ ์ป๋ ๊ฒ์ด์์ต๋๋ค. ์ด ๋ฒ๊ทธ์ ์ถฉ๋ํ๊ณ jQuery๋ก ๋์ ์์ต๋๋ค. (์์งํ jQuery๋ฅผ ๋๋ฌด ๋ง์ด ๊ฐ์ดํ์ง๋ง ๊ทธ๋ ๊ฒํด์ผํ์ต๋๋ค). ๊ทธ๋์ ์ ๋ ์ฌ๋๋ค์ด ์ด ์ค๋๋๊ณ ํด๊ฒฐ๋์ง ์์ ๋ฒ๊ทธ๋ณด๋ค ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋๋ง์น๊ฒ ๋ง๋๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํ๋ ๋ชจ๋ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ฐ๋ฐ์๋ก์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ฌ์ด ์ผ์ด ์๋๋ผ๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ ์ธ์ ๊ฐ jQuery๋ฅผ ์ค๋จํ๊ณ ๋ค์ ์ฌ๊ธฐ๋ก ๋์์ฌ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@HakamFostok ์ ๋ api ํ ํฐ์ ์ป๊ธฐ ์ํด ํ๋ก๋์
์์ github/fetch๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. jquery์ ๋์์ผ๋ก ํ์ํ ์ ์์ต๋๋ค.
https://github.com/github/fetch
@usopan ๊ฐ์ฌํฉ๋๋ค ์๋ณด๊ณ ๊ฐ๋๋ค
@HakamFostok
์ด ์ค๋ฅ๋ฅผ ๊ทน๋ณตํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ QS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. qs๋ฅผ ์ค์นํ ํ์๊ฐ ์์ต๋๋ค. qs.stringify์ ํจ๊ป ์ง์ ์ฌ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
let qs = require('qs');
let result = await axios.post(url,
qs.stringify({
refresh_token: refresh_token,
grant_type: 'refresh_token'
}),
{
headers: {
"Content-Type": "application/json"
},
auth: {
username: 'username',
password: 'secret'
}
});
๊ทธ๊ฒ์ผ๋ก ES6์์ ํจ์ฌ ๋ ๋์ axios๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค ;)
๊ทธ๋ฌ๋ ๋น์ ์ ์์ ํ ์ณ์ต๋๋ค. ์ด ๋ฒ๊ทธ๋ ์ค๋ ์ ์ ํด๊ฒฐ๋์ด์ผ ํฉ๋๋ค. ๋ฌด์์ด ๊ทธ๋ค์ ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฌ๋์ง ๋ชจ๋ฆ ๋๋ค.
@HakamFostok @Silve2611 qs ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ํ๋์ง ํ์ธํ๊ณ ์ฌ๊ธฐ์์ ํ ํฐ์ ์ป๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. https://github.com/Halceyon/aspnet-auth/blob/master/src/AspnetAuth.js
์, 'qs' ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ํ๊ณ ์์ง๋ง ๋ฌธ์ ๋ ํ๋ก์ ํธ์์ 'qs'๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด์จ๋ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ฒฐ๊ตญ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฒ๋ฆฌ๊ณ ajax ๋ผ์ด๋ธ๋ฌ๋ฆฌ https://github.com/fdaciuk/ajax ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ซ์ต๋๋ค. ๋ชจ๋ ์ฌ๋์ด ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๊ณ ๊ทธ๊ณณ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
qs ๋ ํ ๋ฌ์ ๊ฑฐ์ 6์ฒ๋ง ๋ฒ ๋ค์ด๋ก๋๋๋ฉฐ 4.8Kb gzip์ผ๋ก ์์ถ๋ฉ๋๋ค.
Express, body-parser, request, superagent ๋ฐ ๊ธฐํ ๋ง์ ๊ฒ๋ค์ด ์ด์ ์์กดํ๊ณ ์์ผ๋ฏ๋ก ๋๋ ค์ํ์ง ์๊ณ ํ๋ก์ ํธ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
@HakamFostok ๋ด๊ฐ ์๋ ํ ์ฝ์ด ๋ชจ๋์ ์ผ๋ถ์ด๋ฏ๋ก ๋ ธ๋ ๋ฒ์ ์ด ์ต์ ๋ฒ์ ์ด๋ฉด ์๋์ผ๋ก ์ค์นํ ํ์๊ฐ ์์ต๋๋ค.
๋๋ ๋จ์ง ๋ช ๋ ์ ์ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ์ง ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ฐธ๊ณ ๋ก ๋ด ํ๋ก์ ํธ๋ React ํ๋ก์ ํธ๋ ์๋๊ณ node๋ ์ฌ์ฉํ์ง ์๊ณ vue.js์ ํจ๊ป ASP.NET MVC๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
"querystring" ๋ชจ๋์ด ๋ด์ฅ๋์ด ์๊ณ ๋ด๊ฐ ์๋ ํ ๋์ผํฉ๋๋ค.
@axios ์ง์๋๋ ์ด ๋ฒ๊ทธ๋ ์ด๋ป์ต๋๊น?
@HakamFostok ๋๋ vue๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ axios์ ์ ๋ง ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค. async await๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ axios์ ๋ง์ ์ด์ ์ด ์์ผ๋ฏ๋ก qs ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํ๊ณ ๋ค์๊ณผ ๊ฐ์ด q๋ฅผ ์๋์ผ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค.
axios.post(
"connect/token",
qs.stringify({
username: this.state.username,
password: this.state.password,
grant_type: "password",
scope: "offline_access"
})
);
์ด๊ฒ๋ ์ ๋ง ๋ฒ๊ทธ์ธ๊ฐ์? ์ ๋ axios๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ธ์ฝ๋ฉ๋ URL์ ์ํํ๊ณ ์์ผ๋ฉฐ ์ ๋๋ก ์๋ํฉ๋๋ค. ์ด์ ์ ์ฌ๊ธฐ์ ๊ฒ์ํ ๋๊ธ์ ๋ด๊ฐ ์ค์ ํ ์ ์ผํ ํญ๋ชฉ์ด๋ฉฐ ์๋ํฉ๋๋ค.
๋ฌผ๋ก ๋ฒ๊ทธ์ ๋๋ค! ๋ฌธ์์ ์ค๋ช ๋ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. ๋ํ axios์์ ๋ช ํํ๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋ ํญ๋ชฉ์ ๋ํด ์ถ๊ฐ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์๋ ๋จ๊ณ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
์, ์ถ๊ฐ ๋จ๊ณ๋ฅผ ์ถ๊ฐํด์ผ ํ ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋ด๊ฐ ํฌ์คํ
ํ๊ณ ์ถ๋ค๋ฉด
headers: {
'Content-type': 'application/x-www-form-urlencoded'
}
์ด๋ ๊ฒ ์จ์ผํด์
axios.post(
"connect/token",
qs.stringify({
username: this.state.username,
password: this.state.password,
grant_type: "password",
scope: "offline_access"
})
);
Content-Type
์ application/vnd.api+json
๋ก ์ค์ ํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์๋๋ฐ #340๊ณผ ์ ์ฌํ๊ฒ ๋ถํํ๋ ํด๊ฒฐ๋์ง ์๊ณ ๋ซํ์ต๋๋ค.
๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ Content-Type
๋ฅผ ๋ณด๋ด๊ธฐ ์ํด ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ดํํ๋ ๊ฒ์ด์์ต๋๋ค. ์ด๋ ์ฒ๋ฆฌํ ๋ application/json;charset=utf-8
๋ฅผ ์ค์ ํ๋ axios ๋ฐฉ์์ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ํดํคํฉ๋๋ค. ๊ฐ์ฒด ๋ฐ์ดํฐ.
axios๊ฐ "์ถ์ธก"ํ๋๋ก ํ๋ ๊ฒ๋ณด๋ค ์๋์ผ๋ก Content-Type
๋ฅผ ์ค์ ํ๋ ๋ฐ ๋ ๋ง์ ๊ธฐ๋ฅ์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ทธ๊ฒ์ ์ฐ๋ฆฌ๋ฅผ ์ํด ๊ทธ๊ฒ์ "์ถ์ธก"ํ๊ฑฐ๋ ์ฐ๋ฆฌ๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ์ค๋ฅ๋ฅผ ๋์ ธ์ผ ํฉ๋๋ค. ํ์ฌ ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ ๋ณด์ด์ง๋ง parans๋ ๋ถ๋ช ํ ์ ํํ์ง ์์ต๋๋ค. axios๋ก ์์ ํ๋ ์ด๋ณด์๋ ๊ทธ๋ฌํ ์ค๋ฅ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค. ์ต์ํ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฌธ์ํํด์ผ ํฉ๋๋ค.
+1 ์ด ๋ฌธ์ ๋ฅผ ์ถ์ ํ๋ ๋ฐ 2์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. ์ต์ํ readme์์ ๋ ๋์ ์ค๋ช /์ฐธ๊ณ ๋ฅผ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. qs๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์ ๋ฐ์ดํธ: ๋ฐ์์ ์ฌ์ฉํ์ฌ qs๊ฐ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค. ์ด๊ฒ์ด ๋์ ํด๊ฒฐ์ฑ ์ด์๋ค. ์ ๊ฒฝ์ฐ์๋ ์์ ๋งค๊ฐ๋ณ์์ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๊ฐ ๋ชจ๋ ํ์ํ์ต๋๋ค.
var data = qs.stringify({
id: 'MY_ID',
action: 'MY_DATA'
});
var params = {
params: {
token: 'MY_TOKEN'
}
};
axios.post('MY_URL', data, params)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
์ค๋ฅ: unsupported_grant_type
import axios from 'axios';
import qs from 'qs' ;
const endPoint = `${endPointApi}/ControllerX`;
const data = qs.stringify({
grant_type: 'password',
user: userName,
password: userPass
});
const headers = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
};
axios.post(endPoint, data, headers)
.then(function (response) {
debugger;
console.log(response);
})
.catch(function (error) {
debugger;
console.log(error);
});
axios.post({
url: endPoint,
data: data,
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
}
})...
@harvic3 ๋ด ์์ ์ฝ๋๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๋ํ ํน์ ํค๋๊ฐ ํ์ํ์ง ์์ต๋๋ค.
2๋ ํ์๋ ์ด ๋ฒ๊ทธ๋ ์ฌ์ ํ ํด๊ฒฐ๋์ง ์์ต๋๋ค
+1
+1
+1 ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค
+1
+1
ping @mzabriskie @nickuraltsev
nodejs ์ธก์ ๋ฌธ์ ๋ ์ข
์์ฑ ์ค ํ๋์ธ follow-redirects
๊ฐ content-type ํค๋๋ฅผ ์ญ์ ํ๊ณ ์๋ค๋ ๊ฒ์
๋๋ค.
+1 ํ์คํ ์ฌ๊ธฐ์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
+1
ํดํน์ qs๋ก ์ฌ์ฉํ์ง ์๋๋ก ์ด ๋ฌธ์ ๋ฅผ ์ต์ข ์ ์ผ๋ก ์์ ํฉ๋๋ค(์, qs๋ ์๋ํจ).
ํค์ด
๋ง์ง๋ง์ผ๋ก qs๋ก ํดํน์ ์ฌ์ฉํ์ง ์๋๋ก ์์ ํ์ญ์์ค.
โ
์ด ์ค๋ ๋์ ๊ฐ์
ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/axios/axios/issues/362#issuecomment-390337824 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AJZ-B0lPoCseiT4WNhJFlHVUTBHbmo9Yks5tzz3FgaJpZM4JAIfw
.
์ด ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค
์ฐ์ค๊ฝ์ค๋ฌ์์ง๊ธฐ ์์ํฉ๋๋ค!
"์ ์ฅ, ์ฐ๋ฆฌ๋ ์ ๋ ์ด๊ฒ์ ๊ณ ์น ์ ์์ด!" :/
+1
+1
์ด๋ค ์์
์ด ๊ทธ๊ฒ์ ์์ ํ๊ณ ํน์ ๋ฒ์ "aaxios"๋ฅผ ๋ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฝํ
์ธ ์ ํ ์ค์ ํ์ฉ
ํ
์คํธํ์ง ์์์ง๋ง ๊ฐ์ ธ์ค๊ธฐ ๋ก ์ด๋ํ์ต๋๋ค.
+1
+1
+1
+1
๐
@camposjorge ๊ฐ ๋งํ๋ฏ์ด https://github.com/axios/axios/pull/1544 ๋๋ถ์ (๊ณง?) ์์ ์ฌํญ์ ๋ณผ ์ ์์ต๋๋ค.
์์ ์์?
+1
ํด๊ฒฐํ์ต๋๋ค! ๊ทธ๊ฒ์ axios ๋ฌธ์ ๊ฐ ์๋๋ผ ๊ต์ฐจ ์์ ์ ๊ดํ ๊ฒ์ ๋๋ค.
set { headers: {'Content-Type': 'application/x-www-form-urlencoded; ๋ฌธ์ ์งํฉ=UTF-8'}}
๊ทธ๋ฆฌ๊ณ
axios ์ต์
์์ transformRequest๋ฅผ ์ฌ์ฉํ์ญ์์ค.
transformRequest: [ํจ์(๋ฐ์ดํฐ) { ๋ฐํ ํ์(๋ฐ์ดํฐ) }],
{a:"a",b:"b"}๋ฅผ "a=a&b=b"๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ์ ํจ์
+1, ์์ ์๋ฃจ์ ์ค ์ด๋ ๊ฒ๋ ์๋ํ์ง ์์์ต๋๋ค.
+1
๋ง์ ์ฌ๋๋ค์ด ์ฌ์ ํ ์ด ๋ฌธ์ ์ ๋ํ ์์ ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ฅผ ํฌํจํฉ๋๋ค. ํ์คํ ์ด ์๊ฐ์ด ์ง๋๋ฉด ์ด์ ๋ํ ์ ์๋ ์๋ฃจ์ ์ด ์์ด์ผ ํฉ๋๋ค.
๋ฐ์์์ qs.stringify๋ก ์ด ๋ฌธ์ ๋ฅผ ์์ ํ์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ axios.post์ ์ ๋ฌํ๊ธฐ ์ ์ qs.stringifyํด์ผ ํฉ๋๋ค.
๋ฌธ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก CSRF ํ ํฐ์ด Axios์ ๊ณตํต ํค๋๋ก ๋ฑ๋ก๋์ด ์์ผ๋ฏ๋ก
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
1- bootstrap.js์์ ์ด ์ค์ ๊ต์ฒดํ์ญ์์ค "
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
ํ ํฐ = document.head.querySelector('meta[name="csrf-token"]');
if (ํ ํฐ) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = ํ ํฐ.๋ด์ฉ;
} ๋ ๋ค๋ฅธ {
console.error('CSRF ํ ํฐ์ ์ฐพ์ ์ ์์ต๋๋ค: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
"
์ด ์ค๋ก "
window.axios.defaults.headers.post['์ฝํ
์ธ ์ ํ'] = '์์ฉ ํ๋ก๊ทธ๋จ/x-www-form-urlencoded';
"
2- npm์ผ๋ก qs ๋ชจ๋์ ์ค์นํ๋ ค๋ฉด ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํ์ญ์์ค.
3- ์๋์ ๊ฐ์ด q์ const๋ฅผ ์ ์ํฉ๋๋ค.
const qs = ์๊ตฌ('qs');
4- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด axios๋ฅผ ์ฌ์ฉํฉ๋๋ค.
axios.post('์ฌ๊ธฐ์ ๊ทํ์ ๋งํฌ ',qs.stringify({
'a1': 'b1',
'a2 ':'b2'
}))
.then(์๋ต => {
alert('ok');
})
.catch(error => alert(error));
์ด๋ฅผ ํตํด axios์์ ์ฝํ ์ธ ์ ํ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ฌ์ค๊ณผ ์๊ด์์ด axios๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์ ์ถํ ์ ์์์ต๋๋ค.
```
const { ์ฑ๋ช
, ์ด๋ฉ์ผ, ๋น๋ฐ๋ฒํธ, ์ ํ๋ฒํธ } = this.state;
axios(URL, {
๋ฐฉ๋ฒ: "POST",
ํค๋: {
์๋ฝ: "์์ฉ ํ๋ก๊ทธ๋จ/json",
"์ฝํ
์ธ ์ ํ": "application/x-www-form-urlencoded"
},
๋ฐ์ดํฐ: this.serialize({
์ด๋ฆ: ์ ์ฒด ์ด๋ฆ,
์ด๋ฉ์ผ: ์ด๋ฉ์ผ,
๋น๋ฐ๋ฒํธ: ๋น๋ฐ๋ฒํธ,
์ ํ: ์ ํ
})
})
.then(์๋ต => {
console.log(์๋ต);
})
.catch(์ค๋ฅ => {
console.log(์ค๋ฅ.์๋ต);
});
์ง๋ ฌํ = obj => {
ํ์ str = [];
(obj์์ p๋ฅผ ๋ณด์)
if (obj.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
๋ฐํ str.join("&");
};
์ถฉ๋. ์๊ธฐ๊ฒ๋ ์ด ์ฑ๊ฐ์ ๋ฒ๊ทธ๋ ๋ช ๋ ์ด ์ง๋ ํ์๋ ์ฌ์ ํ ์์ ๋์ง ์์์ต๋๋ค.
์ถฉ๋. ์ฌ๊ธฐ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ํ์ํฉ๋๋ค. ํ์ํ af๋ฅผ ์์ ํ์ญ์์ค.
@mzabriskie
๊ณ ์ ์ผ๋ก ๋ซ์์ผ ํ๋๊ฑฐ ์๋๊ฐ์?
์ ์ ํ ํค๋๋ก ํ
์คํธํ์ผ๋ฉฐ ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์์ต๋๋ค.
์์ฒญ ํค๋
์ฌ๊ธฐ์์ ํค๋ ์ค์
form-urlencoded ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ (์ผ์์ ์ผ๋ก) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
return preset.post("/app/BookingProc.do",formurlencoded(dat),{
headers:{
Cookie:session
}
}).then(response=>{
return response
})
@mzabriskie
๊ณ ์ ์ผ๋ก ๋ซ์์ผ ํ๋๊ฑฐ ์๋๊ฐ์?
์ ์ ํ ํค๋๋ก ํ ์คํธํ์ผ๋ฉฐ ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์์ต๋๋ค.
์์ฒญ ํค๋
์ฌ๊ธฐ์์ ํค๋ ์ค์
์๋ ์ด๊ฒ์ ๋ซ์ ์ ์์ต๋๋ค!!!
๋ชจ๋๊ฐ ๋ฌธ์ ์ ์ง๋ฉดํด ์๊ณ ์ด๋์์ ํด๊ฒฐ์ฑ
์ ์ฐพ์ ์ ์์ต๋๋ค. ํค๋๋ฅผ ์ค์ ํ์ง ์๊ณ ์๋ํ๊ฑฐ๋ ํ์ค ํค๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์๋ ์์น๋ฅผ ํ์ํ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํด์ผ ํฉ๋๋ค.
๋ํ ๋ฌธ์๋ฅผ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
์์ง ๊ณ ์ฅ๋ฌ์ด!
์ถฉ๋. ์ด ๋ฒ๊ทธ๋ ์ฌ์ ํ ์ ์๋ฆฌ์ ์์ผ๋ฉฐ ๊ธฐ๋ถ์ด ์ข์ต๋๋ค!
์ถฉ๋
์ด ๋ฒ๊ทธ๋ ์์ง ์ด์ ์์ต๋๋ค!
๋๋ ๋ํ์ด ๋ฒ๊ทธ๋ฅผ ๊ฒฝํํ๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ ์์ง๋ ์ญ๊ฒน๋ค
const axios = require('axios');
const qs = require('querystring');
axios.post(`${this.api}siteverify`, qs.stringify({
secret: this.secret,
response: recaptchaToken,
remoteip: userIP,
}), {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
});
์ด๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค. ํ์ฌ ๊ฐ๋ฐ์ค์ธ ์ฑ์์ ์ฐข์์ต๋๋ค. ์ด ๋ถ๋ถ์ ๊ตฌ๊ธ์ ๋ฆฌ์บก์ฐจ๋ฅผ ํ์ธํ๊ธฐ ์ํ ๋ถ๋ถ์ ๋๋ค.
์ฌ์ ํ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค ...
๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
axios.defaults.headers.common['Accept'] = 'application/json'; // working
axios.defaults.headers.common['Content-Type'] = 'application/json;charset=UTF-8'; // NOT working
๋ํ ์์ฒญ ์ค์ ์ด ์๋ํ์ง ์์ต๋๋ค.
axios.get(url, {
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
@aaroninn ์ด๊ฒ์ ๋์ผํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทํ์ ๋ฌธ์ ๊ฐ axios
( vuex
์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ๊ณผ ๋ ๊ด๋ จ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค ๋์ง๋ง ํ์ ํ ์ ์๋ค)
์ด ์ค๋ ๋๋ ์ด๋ฏธ +1
๋ก ๊ฐ๋ ์ฐจ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์์งํ ํ์๊ฐ ์์ต๋๋ค.
https://github.com/axios/axios/issues/362#issuecomment -229817415
@mzabriskie ๋น์ ์ด ์ด ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ปค๋ฐ์ ์์ฑ์์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ ๋ํด ์๋ฌด ๊ฒ๋ ํ ์ ์์ต๋๋ค(๋น์ ์ด ์ฒ์์ ๊ทธ๊ฒ์ ํ ์ด์ ์กฐ์ฐจ ์ดํดํ์ง ๋ชปํ๋ค๋ฉด, ๋น์ ์ ๊ทธ๊ฒ์ ๋๋๋ฆด ์/ํด์ผ ํฉ๋๋ค, ์ค๋ฅธ์ชฝ?)
๋ฏธ๋ฆฌ ๊ฐ์ฌํฉ๋๋ค
2018๋ ์ด๋ค! ์์ ์ด๋ค ๋ต๋ณ์์ ๋ฐ๋ ํฌํ๋ฅผ ํ๋ฉด ์ ๋ฉ๋๊น?
์ฐ๋ฆฌ ๋ชจ๋๊ฐ Axios๋ฅผ ์ฌ๋ํ๋ ์ด์ ๋ฅผ ๋ค์ ๋งํด์ฃผ์ธ์.
์ด ๋ฌธ์ ๋ ์์ ์ด ํ์ํฉ๋๊น? ์๋๋ฉด ์๋ฐ์ ์ธ ๊ฒ์ธ์ง ๋ฌป์ต๋๋ค. ๊ฐ์ ํ ์ง 2๋ ์ด ์ง๋ฌ์ง๋ง ์๋ฌด๋ ๊ณ ์ณ์ฃผ์ง ์์์ต๋๋ค. ์๋ฐ์ ์ด๊ณ ๊ณ ์น ํ์๊ฐ ์์ต๋๊น?
@jeremycare ๋ฐฉ๊ธ ๊ทธ ๋ฌธ์ ์ ๋ํ PR์ ์์ฑํ์ต๋๋ค... ์ ๋ง ์ง์ฆ๋๋ "๋ฒ๊ทธ"์ด๋ฉฐ ์์ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํนํ ์ด ๋ฌธ์ ๋ฅผ ์์ ํ๊ณ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ๋ง ์ฝ์ต๋๋ค.
์๋ค์, ์ด ํฐ์ผ์ด ์์ง ์ด๋ ค์๋ ์ด์ ๋ฅผ ์ ๊ฒ ๊ฐ์.
์๋ํ๋ค๊ณ ๋งํ๋ ์ฌ๋๋ค์ ์ด์ "q" ๋ชจ๋์ ์ฌ์ฉํ๊ณ ์๋ํ์ง ์๋๋ค๊ณ ๋งํ๋ ์ฌ๋๋ค์ "querystring" ๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค.
ํค๋์ ๋ฌธ์ ๊ฐ ์๋ ์ฌ๋๋ค๋ ๋ดค์ต๋๋ค. ์ด ํฐ์ผ์ ๋ชจ๋ ๊ฒ์ ์ฝ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ณ ์ด ํฐ์ผ์ ๋ฌธ์ ์ ๋ํ ๋ชจ๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํ ์๋ ์์ง๋ง ๋๊ตฐ๊ฐ ์์ ๋ฐ์ดํฐ ์์
์ ์์ฒญํ ์ ์๋ค๋ฉด ๋ค๋ฅธ ๊ฒ์ ์๋ํ๊ธฐ ์ ์ ์ด๊ฒ์ ํ์ธํ์ญ์์ค.
์ฌ๊ธฐ์ ๋ชจ๋ ์ค๋ช : https://github.com/axios/axios/issues/1894
Axios๊ฐ ์ค์ ์ ์คํจํ์ ๋ ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ fetch
์ ์ค์ ์ธ์ด Content-Type
์ค์ ์ผ๋ก ์ฆ์ ์๋ํ๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ์ค๋ง์ค๋ฝ์ต๋๋ค. ํ๋ซํผ ๊ฐ์ Interop์ ์ ์๊ฒ ๊ฐ์ฅ ํฐ ํ๋งค ํฌ์ธํธ์์ต๋๋ค.
transformRequest
๋ฉ์๋์์ ํค๋๊ฐ ์ค์ ๋์ด ์์ง๋ง ์ค์ ์์ฒญ์๋ ๋๋ฌํ์ง ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋จ์ํ ํ
์คํธ ๋ณธ๋ฌธ์ ๋ณด๋ด๋ ์ค์ด๋ฏ๋ก qs ๋ชจ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ด๊ฐ ๊ฒฝํํ ๊ฒ์ ๋ค์ ํํํ์๋ฉด: axios๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์์ Content-Type
ํค๋๋ฅผ ๋ฎ์ด์ธ ์ ์์ต๋๋ค. ๋ฌธ์์ด ํ์ด๋ก๋(formdata ์์)๋ฅผ ๋ณด๋ด๊ณ ์์ผ๋ฏ๋ก qs
/ querystring
๋ชจ๋์ ์ ๊ฒฝ์ฐ์ ๊ด๋ จ์ด ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฌด์์ ํ ์ ์์ต๋๊น?
ํธ์ง: ์ง๊ธ์ ๋ธ๋ผ์ฐ์ ์ ์์ ๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
EDIT2: ์ฌ๋ฌ ํ๊ฒฝ(Node/Browser/React-Native ๋์)์์ ๋ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ( cowl )๋ฅผ ๊ตฌ์ถํ์ต๋๋ค. axios์ ํ๋ถํ ๊ธฐ๋ฅ์ ๋์ฒดํ๋ ๊ฒ์ ์ ๋ ์๋์ง๋ง ๋ชจ๋ ๊ธฐ๋ณธ ์ฌํญ์ ์ง์ํฉ๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํค๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์ค์ ํ๋ฉด "Content-Type"์ ์ ์ธํ๊ณ ๋ ์๋ํฉ๋๋ค! ๋์์ฃผ์ธ์!
์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ๋ ธ๋์ ๋ฐ์ ๋ค์ดํฐ๋ธ ๋ด์์ axios๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ค๋ฅธ ์ง์ ๋ถํ ํ์ด๋ธ๋ฆฌ๋ ์ฑ์ ๋ง๋ค์ด์ผ ํ์ต๋๋ค. ๊ทธ ๋ฐ๋๊ฐ ์๋๋ผ ์ด๋ฐ ์์ด๋ผ๋ ๊ฒ ์๊ธด ๊ฒ ๊ฐ๋ค. ์ด ๋ฌธ์ ๊ฐ ๊ณง ํด๊ฒฐ๋์ด ์์ญ์ด ํจ์น๋ฅผ ์ ๊ฑฐํ ์ ์๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค.
์ด๊ฒ์ด ์ฟผ๋ฆฌ์คํธ๋ง๋ง์ ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ๊ฒ์ ๊นจ๋ซ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด ๋ณธ๋ฌธ ๋ด์ฉ์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์์ ํ
์คํธ์ด์ง๋ง Content-Type
๊ฐ ์๋ axios๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด๋ผ ์๋ ์์ต๋๋ค.
๋๋ ํฌ์คํธ๋ฅผ ์ฌ์ฉํด ๋ณด์์ง๋ง ์ ์๋ํ๋ค. ํฌ์คํธ์ ๊ธฐ๋ณธ๊ฐ์ json์ด๋ค.
์ง๊ธ ์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ณ ์์ต๋๋ค... ๋ช ๋ ์ด ์ง๋๋ ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ์...
๋๋ฌ์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ PR์ ๋ง๋ค์๋๋ฐ... ์ ๋ณํฉ์ด ์๋๋์ง ์ดํด๊ฐ ์๊ฐ๋ค์?!
๋๋ฌ์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ PR์ ๋ง๋ค์๋๋ฐ... ์ ๋ณํฉ์ด ์๋๋์ง ์ดํด๊ฐ ์๊ฐ๋ค์?!
์๋ 9์ ์ดํ๋ก ์๋ฌด๋ ์ถ์งํ์ง ์์๋ค๋ ์ฌ์ค์ ๋ช ์ฌํ์ญ์์ค. ์๋ง๋ ๊ทธ๋ค์ ์ ์ง ๋ณด์๋ฅผ ์ฐพ๊ณ ์์ ๊ฒ์ ๋๋ค. ๋ํ ๊ทํ์ PR์ https://github.com/axios/axios/pull/1544/files ์ ๋น๊ตํ ๋ ํ ์คํธ๋ฅผ ๋์น ๊ฒ ๊ฐ์ต๋๋ค.
@mzabriskie ์ด PR ์ค ํ๋๋ฅผ ๋ณํฉํ๋ ์ฑ ์์ ๋งก์ ์ ์์ต๋๊น? ํ์ฌ ์ผ๋ถ ์ํํธ์จ์ด๋ ์ฝํ ์ธ ์ ํ ์ธํธ๋ฅผ ๊ฐ๊ธฐ ์ํด ์์ฒญ์ ๋ฐ์์ผ ํฉ๋๋ค(RoR ๋งค๊ฐ๋ณ์, ์: https://guides.rubyonrails.org/api_app.html#using-actiondispatch-request). https://github.com/axios/axios/issues/362#issuecomment -229817415์ ์ง์ ๋ ์๋ฃจ์ ์ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๋ฌด์๋ณด๋ค ์ด ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ชจ๋ ์ ๋ง์ ์ธ ํดํน์ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.
axios
๊ฐ ๋ฒ๋ ค์ง ๊ฒ ๊ฐ์์ got
ํจํค์ง๋ก ์ฎ๊ฒผ์ต๋๋ค.
๋ฐ๋ผ์ Axios๋ ๊ณต์์ ์ผ๋ก 'Content-Type': 'application/x-www-form-urlencoded'๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์๊ฑฐ๋ @ChBernat ์๋ฃจ์ ์ด ์ค์ ๋ก ์๋ํฉ๋๊น?
ATM์์ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
ATM์์ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ฌ๊ธฐ์์ 1๋ ์ ๊ฒ์ํ๋ฉด ๋ง์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ณผ ์ ์์ต๋๋ค... ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ์ ๋ฅผ ํฌํจํ์ฌ ์ ๊ฐ ๊ถํ๊ณ ์ถ์ง๋ง, axios์์ ๊ณ์ ์งํํ์ญ์์ค. ๋ฒ๋ ค์ง๊ฑฐ์ผ...
์์ฐ... ๊ทธ๋ค์ ์ด ์์ ์์ ํ๋ก์ ํธ๋ฅผ ํฌ๊ธฐํด์ผ ํฉ๋๋ค. ์ ๋ ์๊ณ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ์ฒ์ ๋ณด๊ณ ๋ ์ง ๊ฑฐ์ 3๋ ์ด ์ง๋ฌ์ง๋ง ์ฌ์ ํ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๊น? ๋ฏฟ์ ์ ์๋. ์ ๋ ์คํ ์์ค๋ฅผ ์ข์ํ๊ธฐ ๋๋ฌธ์ ์ด ํ๋ก์ ํธ์ ๋ํด ์ด๋ค ๋์ ๊ฐ์ ๋ ํ๊ณ ์์ง ์์ต๋๋ค. ์ ์ง ๊ด๋ฆฌ์๊ฐ ์์ง๋ง... ๊ทธ๊ฒ์ ๋ง์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ฏ๋ก ๋น์ ์ด ํ ์ ์๋ ์ต์ํ์ ๊ฒ์ ๊ทธ๊ฒ์ ๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ฏ๋ก ์ฐ๋ฆฌ ๋ชจ๋๋ ์ด ํ๋ก์ ํธ๊ฐ ์ฃฝ์๋ค/์ฃฝ์ด๊ฐ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ฐ์ฌ ํด์.
@justintime4tea ์๋ก์ด ์ถ์ฒ์ด ์์ต๋๊น?
got
@kslr ์ด ์ป์๊ฑฐ๋ ์์ฒญํ ๋ด์ฉ์ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์์ํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ ๋ Axios๋ฅผ ๊ณ ์ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ง๋ง ๊ธฐ๋ณธ HTTP ์์ฒญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ต์ฒดํ ์ ์๋๋ก ์ถ์ํ ๊ณ์ธต์ ์์ฑํ๋ ๊ฒ์ผ๋ก ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ "๋น๋๋ -in" HTTP ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ๋ ๋๋ก ๊ทธ๋๋ก ๋์ญ์์ค.
๋๋ ์ด์ ๊ฐ์ ๊ฒ์ ์๋ํ๊ณ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
์ต์ ์ ํด๊ฒฐ์ฑ
์ ์๋์ง๋ง ์ค์ ๋ก ๋์์ด ๋ ์ ์์ต๋๋ค(์ ์๊ฐ์๋). ์ด ์๋ฃจ์
์ด ๋์ฐํ๋ค๋ฉด ์ด๋ค ์ ์์ด๋ ํ์ํฉ๋๋ค.
const foo= yield qs.stringify({
'grant_type' : 'yourGrantType',
'param' : param,
'param' : param
})
const bar= yield axios.post('/baz', foo)
ํค๋๋ฅผ ์ ๊ฑฐํ๋๋ฐ ์ ๋ฐ์ ๊ฒ ๊ฐ์ต๋๋ค.
axios({
url,
method: 'POST',
headers:{
'Content-Type': 'application/json'
},
data: null, // important
})
RoR์ ๋ฐฑ์๋๋ก ์ฌ์ฉํ๋ ๋ฐ ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๋ด ์ปจํ ์คํธ:
๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ vue-resource
๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๊ฐ ์์๊ณ ์ถ๊ฐ ๊ตฌ์ฑ ์์ด ๋ชจ๋ ๊ฒ์ด ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ํ๋ก์ ํธ์ ์ข
์์ฑ์ ๊ตฌ์ฑํ๊ณ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์ข
์์ฑ์ ๋์ฒดํ๋ฏ๋ก vue-resource
๋ฅผ axios
๋ก ๋์ฒดํ์ต๋๋ค. ;)...
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ์๊ฒ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์๊ณ ์๋์์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ด๊ฐ ํ๋ ์ผ์ ๊ณต์ ํ ๊ฒ์ ๋๋ค. ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์๋ ์์ต๋๋ค! ๊ธฐ๋ํ ๋งํผ ๋์์ด ๋์ง ๋ชปํ๋ค๋ฉด ์ฃ์กํฉ๋๋ค
์ฒซ ๋ฒ์งธ ๋ฌธ์ , ๋ฌธ์ ๋ ์ด ๋ฌธ์ ์ ๋์ผํ๋ฉฐ ๋ค์์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
axios.interceptors.request.use(config => {
config.paramsSerializer = params => qs.stringify(params);
return config;
});
์ด์ ๋งค๊ฐ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
q: {
search: "Something",
sort: "asc",
}
๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋ฉ๋๋ค.
http://xxxx/?q%5Bsearch%5D=something&q%5Bsort%5D=asc
์ด ๊ตฌ๋ฌธ ๋ถ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
q[search]: something
q[sort]: asc
๋ ๋ฒ์งธ ๋ฌธ์ , RoR์ JSON ์๋ต ๋์ HTML ์๋ต์ ๋ฐํํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ๋ฐฑ์๋๊ฐ AJAX ์์ฒญ์ ๋ค๋ฅธ ์ ํ์ ์์ฒญ๊ณผ ๊ตฌ๋ณํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก vue-resource
๋ ์ด๋ฏธ X-Requested-With
ํค๋๋ฅผ ์์๋๋ก ์ค์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ axios๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์์ฒญ ํค๋์ ์ด ํค๋ฅผ ์ ์ํด์ผ ํ์ต๋๋ค. ๋ด Axios ์ ์ญ ๊ตฌ์ฑ์ ๊ฒฐ๊ตญ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
axios.interceptors.request.use(config => {
config.paramsSerializer = params => qs.stringify(params);
return config;
});
axios.defaults.headers.common['Accept'] = 'application/json';
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
===
Rails๋ฅผ ๋ฐฑ์๋๋ก ์ฌ์ฉํ๊ณ ์๊ณ ์ด๋ค ์๋ฃจ์ ๋ ๋์์ด ๋์ง ์๋๋ค๋ฉด ์๋ ค์ฃผ์ธ์. ์๋ง๋ ์ ๊ฐ ๋์๋๋ฆด ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค =).
์ด๊ฒ์ ์ฌ์ฉํ์ญ์์ค .. https://gist.github.com/akexorcist/ea93ee47d39cf94e77802bc39c46589b#gistcomment -2878451
๋ฐ์ ๋ค์ดํฐ๋ธ์์ ์์
์ค์ด๋ฉฐ ๋ค์์ ์ฌ์ฉํ ๋ ์๋ชป๋ ์์ฒญ 400 ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
* '์ฟผ๋ฆฌ ๋ฌธ์์ด'์์ qs๋ก ๊ฐ์ ธ์ค๊ธฐ;
axios.post(url,qs.stringify({
'์ด๋ฆ': '๊น์',
'์ฑ': 'ํ๋กํธ๋ผ',
}),{
ํค๋: {
'์ฝํ
์ธ ์ ํ': '์์ฉ ํ๋ก๊ทธ๋จ/x-www-form-urlencoded; ๋ฌธ์ ์งํฉ=UTF-8'
}
}).then((์๋ต)=>{
console.log('์์
')
}).catch((์ค๋ฅ)=>{
console.log('์ค๋ฅ')
console.log(์ค๋ฅ)
})
๊ทธ๋์, ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ?
๋ชจ๋ ์๋ฃจ์ :(
ํด๊ฒฐ qs
{ data: qs.stringify(bodyObject) }
์ด ๋ฌธ์ ๋ก ๋ง์ ์ฌ๋๋ค์ด ํผ๋์ค๋ฌ์ ํ๋ ๊ฒ์ ๋ณด๋ ์ํ๊น์ต๋๋ค. ๋๋ ๊ทธ ์๊ฒฌ์ ์ฝ์ผ๋ ค๊ณ ์ต์ ์ ๋คํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ค๋ฅธ ๋ง์ ๋ฌธ์ ๋ฅผ ํฌํจํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ๋ฌ๋ถ, ๋ซ๋ ๊ฒ์ ์ฉ์ํ์ญ์์ค. ๋๊ตฐ๊ฐ๊ฐ ๋ฌธ์ ๋ฅผ ๋ช ํํ๊ฒ ์ค๋ช ํ๊ธฐ ์ํด ์ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์๋ค๋ฉด ๊ทธ๊ฒ์ ๋น์ ์๊ฒ ์ ๋ง ํฐ ๊ฐ์ฌ๊ฐ ๋ ๊ฒ์ ๋๋ค.
์๋ ๋ชจ๋๋ค,
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ด ์ธ์์ ๊ฑฐ์ ํ๋ฃจ ์ข ์ผ์ ๋ญ๋นํ๋ฉด์ ๋ด๊ฐ ์ ํ๋ฅผ ๊ฑธ์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ด๊ฒ์ ๋ถ๋ถ์ ์ผ๋ก ๋๋ ์์ ํ ๋์์ด ๋ ์ ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ์ ์ฉํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ด ๋๋ต์ ๋ค์๊ณผ ๊ฐ์ Axios์์ POST๊ฐ ์คํจํ ๋ค์ํ ์ด์ ๋ฅผ ๋ณด์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ์ด์ ๊ฐ์ด ๊ตฌ์ฑ์์ Axios์ ์ฌ์ฉ์ ์ ์ ํค๋๋ฅผ ์ ๋ฌํ ๋ Bad Request 400์ผ๋ก ์ด ์ค๋ ๋์ ๋ชจ๋ ์ฌ๋๊ณผ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ qs.stringify()๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์์ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ฌ๊ธฐ์์ ๋ง์ ์๋ต์ ์๋ํ์ต๋๋ค. null ๋๋ {}๋ ์๋ฌด ์์ฉ์ด ์์ต๋๋ค.
1) ์ฐธ๊ณ - .catch() ๋ธ๋ก์ ์ถ๊ฐํ๊ณ ์ด์ ๊ฐ์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๋ ๊ฒ์ ๊ทธ๋ค์ง ๋น๋ฐ์ค๋ฝ์ง ์์ ์ค๋ฅ๋ฅผ ํ๋ฉดํํ ์ ์์๊ธฐ ๋๋ฌธ์ ์ ๋ง ๋์์ด ๋์์ต๋๋ค. ์ด ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฒ๊น ํ๊ณ ๊ถ๊ทน์ ์ผ๋ก ๋ด๊ฐ ๊ฒช๊ณ ์๋ ๋ฌธ์ ๋ฅผ ํ์ ํ ์ ์์์ต๋๋ค.
2) .then() ๋ธ๋ก์์ response.data
๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Converting circular structure to JSON
์ด์ ๋ด ๋ฌธ์ ๋ api POST ๋ณธ๋ฌธ์ด ๋์ ์ด ์ํ๋ ๊ฒ์ด ์๋์์ง๋ง ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ ์ ์์ ๋๊น์ง ๋ณผ ์ ์์์ต๋๋ค.
๋ํ, ์ ๋ NestJS์ Axios์ ๋ํผ์ธ HttpService๋ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์ค์ ์ค๋ฅ๊ฐ ๋ด ํ์ดํ์ catchError ์ฝ๋ฐฑ์์ ๋ฒ๋ธ๋ง๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ฑ ๋ณต์กํด์ก์ต๋๋ค.
์ฌ๊ธฐ ์์ํ Axios์ NestJS๋ฅผ ์ํ ์๋ฃจ์ ์ด ์์ต๋๋ค.
์ก์์ค์ค:
const headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
return axios.post('https://some-made-up-endpoint, dataString, { headers })
.then(resp => resp.data)
.catch(error => {
this.logger.log('ERROR: ${JSON.stringify(error.response.data)}');
});
๋ค์คํธJS:
const headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
return this.http.post('https://some-made-up-endpoint, dataString, { headers }).pipe(
map(response => response.data), // This is important otherwise - circular JSON error
catchError((error: any) => {
this.logger.error('[[[[ ERROR TRYING TO FETCH TOKEN: ${error.message} ]]]]');
return of()
})
).toPromise();
TLDR;
1) .catch() ๋ธ๋ก์ ์ถ๊ฐํ์ฌ ์ค์ ์ค๋ฅ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ๋กํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด 400 ์๋ชป๋ ์์ฒญ์
๋๋ค.
2) ๋ฐ์ดํฐ ์๋ช
์ด API๊ฐ ๊ธฐ๋ํ๋ ๊ฒ๊ณผ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค. ์ด๊ฒ์ ์ฝ๋ 400์ด '์๋ชป๋ ์์ฒญ'์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ์กด์ฌํ๋ ์ด์ ์ค ์ผ๋ถ์
๋๋ค.
3) Axios๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ .then() ๋ธ๋ก์์ response.data
๋ฅผ ๋ฐํํ๊ณ NestJS๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ง๋ ์ฐ์ฐ์์์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด Converting circular JSON
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ธด ๊ธ ์ฃ์กํ๊ณ ๋ชจ๋๋ค ํ์ด์ ๋น๋๋ค!
๊ฑด๋ฐฐ
๋ฐ์ ๋ค์ดํฐ๋ธ์์ ์์ ์ค์ด๋ฉฐ ๋ค์์ ์ฌ์ฉํ ๋ ์๋ชป๋ ์์ฒญ 400 ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
* '์ฟผ๋ฆฌ ๋ฌธ์์ด'์์ qs๋ก ๊ฐ์ ธ์ค๊ธฐ;
axios.post(url,qs.stringify({
'์ด๋ฆ': '๊น์',
'์ฑ': 'ํ๋กํธ๋ผ',
}),{
ํค๋: {
'์ฝํ ์ธ ์ ํ': '์์ฉ ํ๋ก๊ทธ๋จ/x-www-form-urlencoded; ๋ฌธ์ ์งํฉ=UTF-8'
}
}).then((์๋ต)=>{
console.log('์์ ')
}).catch((์ค๋ฅ)=>{
console.log('์ค๋ฅ')
console.log(์ค๋ฅ)
})
๋๋ฅผ ์ํ ์ด ์ํ. ์ฟผ๋ฆฌ stringfy ๊ฐ์ฌํฉ๋๋ค.
๋ ๋ด ๋ชฉ์จ์ ๊ตฌํด
๋์ qs์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
var qs = require('qs'); axios.post('/foo', qs.stringify({ 'bar': 123 });
์๋ฃจ์ ์ด ์๋ ์ค์ ๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋์ qs์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.