Axios: ์ฝ˜ํ…์ธ  ์œ ํ˜• ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ/x-www-form-urlencoded

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

์ฝ˜ํ…์ธ  ์œ ํ˜•์ด 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๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํ—ค๋”๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

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

๋Œ€์‹  qs์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 });

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

๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ๋ณด์—ฌ์ค€๋Œ€๋กœ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•  ๊ฒƒ์ด๋‹ค.

์›์ธ์€ ์ธํ„ฐ์…‰ํ„ฐ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ํ•ด๋‹น 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 ์–‘์‹ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์ง€์›ํ•˜๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ๋งŒ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • axios#post(url[, ๋ฐ์ดํ„ฐ[, ๊ตฌ์„ฑ]])
  • axios#put(url[, ๋ฐ์ดํ„ฐ[, ๊ตฌ์„ฑ]])
  • axios#patch(url[, ๋ฐ์ดํ„ฐ[, ๊ตฌ์„ฑ]])

+1

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค!

๊ทธ๊ฒƒ์€ ๋งˆ์น˜... ์˜์›ํžˆ ์—ด๋ ค์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ „ request lib๋Š” ๊ทธ๊ฒƒ์„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

+1

+1

+1

๋‹ค์Œ์€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์šฐ์„  ์—ฌ๊ธฐ๋ฅผ ์ฝ์–ด์ฃผ์„ธ์š”: https://github.com/axios/axios#using -applicationx-www-form-urlencoded-format

์ˆ˜์ • ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ด๋™: https://github.com/WebReflection/url-search-params

  2. npm์œผ๋กœ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—ฌ๊ธฐ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/WebReflection/url-search-params/blob/master/build/url-search-params.js

  3. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ๊ฒฝ์šฐ ํŒŒ์ผ์— ํฌํ•จํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

//For e.g. in your index.html, 
<script src="url-search-params.js"></script>
  1. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด POST ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
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);
    });

๋กœ๊ทธ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Axios๋ฅผ React์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์œผ๋ฉฐ ์ด ๋ฌธ์ œ๋กœ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ๊ณ ๊ตฐ๋ถ„ํˆฌํ•œ ํ›„ ์†”๋ฃจ์…˜์€ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜: 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 ๋‚ด ์ž‘์—… ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํŠน์ • ํ—ค๋”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/Awesome-CMS-Core/Awesome-CMS-Core/blob/master/src/AwesomeCMSCore/AwesomeCMSCore/React/js/App/Modules/Account/LoginForm.jsx#L40 -L79

2๋…„ ํ›„์—๋„ ์ด ๋ฒ„๊ทธ๋Š” ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

+1

+1

+1 ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

+1

+1
ping @mzabriskie @nickuraltsev

nodejs ์ธก์˜ ๋ฌธ์ œ๋Š” ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜์ธ follow-redirects ๊ฐ€ content-type ํ—ค๋”๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

screenshot from 2018-05-15 17-17-46
https://github.com/olalonde/follow-redirects/blob/1b6340f83ad5596a0a38c16a7113692bd90301f2/index.js#L188 -L192

+1 ํ™•์‹คํžˆ ์—ฌ๊ธฐ์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

+1

ํ•ดํ‚น์„ qs๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ด ๋ฌธ์ œ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ, qs๋Š” ์ž‘๋™ํ•จ).

ํ—ค์ด

  1. maj 2018 23.31 skrev "Leonid Ershov" ์•Œ๋ฆผ @github.com:

๋งˆ์ง€๋ง‰์œผ๋กœ 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๊ฐ€ ์‹คํŒจํ•œ ๋‹ค์–‘ํ•œ ์ด์œ ๋ฅผ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  1. 400 ์ž˜๋ชป๋œ ์š”์ฒญ
  2. ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”๋กœ ๊ฒŒ์‹œํ•  ์ˆ˜ ์—†์Œ(์˜ˆ: ์ด ์Šค๋ ˆ๋“œ)
  3. ๋ฐ์ดํ„ฐ/ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ง๋ ฌํ™”/๋ฌธ์ž์—ดํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์—์„œ 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 });

์†”๋ฃจ์…˜์ด ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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