양식 데이터 전송 요청


204

axios POST요청이 컨트롤러의 URL에 충돌하지만 null 값을 POJO 클래스로 설정하고 크롬에서 개발자 도구를 사용할 때 페이로드에 데이터가 포함됩니다. 내가 뭘 잘못하고 있죠?

Axios POST 요청 :

var body = {
    userName: 'Fred',
    userEmail: 'Flintstone@gmail.com'
}

axios({
    method: 'post',
    url: '/addUser',
    data: body
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

브라우저 응답 :

여기에 이미지 설명을 입력하십시오

헤더를 다음과 같이 설정하면

headers:{
  Content-Type:'multipart/form-data'
}

요청에서 오류가 발생합니다

multipart / form-data 게시 오류 컨텐츠 유형 헤더에 경계가 없습니다.

우편 배달부에서 동일한 요청을하면 정상적으로 작동하고 POJO 클래스에 값을 설정합니다.

누구든지 경계를 설정하는 방법이나 축을 사용하여 양식 데이터를 보내는 방법을 설명 할 수 있습니까?

답변:


331

다음 과 같이 FormData () 를 사용하여 축 데이터를 게시 할 수 있습니다 .

var bodyFormData = new FormData();

그런 다음 보내려는 양식에 필드를 추가하십시오.

bodyFormData.set('userName', 'Fred');

이미지를 업로드하는 경우 사용할 수 있습니다 .append

bodyFormData.append('image', imageFile); 

그리고 당신은 axios post 방법을 사용할 수 있습니다 (그에 따라 수정할 수 있습니다)

axios({
    method: 'post',
    url: 'myurl',
    data: bodyFormData,
    headers: {'Content-Type': 'multipart/form-data' }
    })
    .then(function (response) {
        //handle success
        console.log(response);
    })
    .catch(function (response) {
        //handle error
        console.log(response);
    });

자세한 내용은 여기를 참조하십시오


8
bodyFormData.set은이 오류가 발생하는 함수가 아닙니다
Manoj Bhardwaj

10
set 대신 append를 사용해야합니다.
Pratik Singhal

1
@ManojBhardwaj 함수를 바인드해야합니다. 제출 함수 u 내부에서 요청을 작성하면 해당 함수를 바인드해야합니다. ex :-onSubmit = {this.submit (bind (this)}} 또는 ex :-생성자 생성자 (super) {this.submit = this.submit.bind (this);} submit () {axios ({}) ; ...}
Srikanth Gowda 2018 년

bodyFormData.append도 나를 위해 일했습니다. 왜 set작동 하지 않는지 확실 하지 않음
Im Batman

1
구성 객체가 잘못되었습니다. 그것은해야한다 :{ method: 'post', url: 'myurl', data: bodyFormData, headers: {'Content-Type': 'multipart/form-data' } }
스티브 테일러

35

querystring을 확인하십시오 .

다음과 같이 사용할 수 있습니다.

var querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' }));

4
이 노드 환경에서 더 나은입니다
Jjagwe 데니스

데이터에 중첩 된 개체가있는 경우 'querystring'이 예상대로 작동하지 않을 수 있습니다. 이 경우 'qs'모듈을 사용하여 데이터를 문자열화할 수 있습니다.
Zihad Ul Islam

33

필자의 경우 다음과 같이 헤더에 경계 를 추가해야했습니다 .

const form = new FormData();
    formData.append(item.name, fs.createReadStream(pathToFile));

    const response = await axios({
        method: 'post',
        url: 'http://www.yourserver.com/upload',
        data: form,
        headers: {
        'content-type': `multipart/form-data; boundary=${form._boundary}`,
        },
    });

이 솔루션은 React Native로 작업하는 경우에도 유용합니다.


3
이것은 imgur의 api에 게시하려고 할 때 문제를 해결했습니다. 문서의 어느 곳에서도 언급되지 않았지만 문서가 없으면 400 개의 잘못된 URL 응답이 나타납니다.
Kolby

1
FormData._boundary는 Chrome 76과 Firefox 67에서 모두 정의되어 있지 않으며 axios는 Content-Type 헤더를 삭제 하므로 아무 효과가 없습니다.
Ash

1
경계 부분은 내 코드에서 누락 된 유일한 노드였으며 노드에서 성능을 발휘했습니다!
Rafael Moni

당신은 구세주입니다
Jithin

안녕하세요, 하나의 문제는 이것이 안드로이드에서만 작동하지만 iOS 기기에서 작동하게 했습니까?
Jithin

15

이진 파일 업로드 (여러)

Node.js

를 통해 파일 multipart/form-data, 특히 여러 이진 파일 을 게시하려는 경우 상황이 복잡해집니다 . 아래는 실제 예입니다.

const FormData = require('form-data')
const fs = require('fs')
const path = require('path')

const formData = new FormData()
formData.append('files[]', JSON.stringify({ to: [{ phoneNumber: process.env.RINGCENTRAL_RECEIVER }] }), 'test.json')
formData.append('files[]', fs.createReadStream(path.join(__dirname, 'test.png')), 'test.png')
await rc.post('/restapi/v1.0/account/~/extension/~/fax', formData, {
  headers: formData.getHeaders()
})
  • headers: {'Content-Type': 'multipart/form-data' }내가 선호하는 대신headers: formData.getHeaders()
  • 내가 사용 async하고 await당신이 그들처럼하지 않으면 위의, 당신은 일반 약속 문으로 변경할 수 있습니다

아래에 새로 추가 된 컨텐츠 :

브라우저

브라우저 FormData는 NPM 패키지 'form-data'와 다릅니다. 다음 코드는 브라우저에서 작동합니다.

HTML :

<input type="file" id="image" accept="image/png"/>

자바 스크립트 :

const formData = new FormData()

// add a non-binary file
formData.append('files[]', new Blob(['{"hello": "world"}'], { type: 'application/json' }), 'request.json')

// add a binary file
const element = document.getElementById('image')
const file = element.files[0]
formData.append('files[]', file, file.name)
await rc.post('/restapi/v1.0/account/~/extension/~/fax', formData)

1
이 예를 들어 주셔서 감사합니다. 여러 파일 업로드가 작동하지 않는 이유를 파악하기가 어려웠습니다.
Minkesh Jain

1
나는 전문가가 아니지만 제 경우에는 여러 파일을 업로드하여 이러한 합병증 ( concat-stream, asyncawait) 을 피하여 다음 을 사용하여 for(var x = 0; x<this.state.files.length; x++) { formData.append('files[]', this.state.files[x]) }제출할 수 있습니다.axios.post(url, formData, config)
laimison

@ laimison 감사합니다, 그것은 나를 위해 작동합니다. 내 답변을 업데이트했습니다.
Tyler Long

@TylerLong FormData API에서 getHeaders 메소드를 찾을 수 없습니다. developer.mozilla.org/en-US/docs/Web/API/FormData
ankur_rajput

9

훨씬 더 간단합니다.

axios.post('/addUser',{
    userName: 'Fred',
    userEmail: 'Flintstone@gmail.com'
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

2
예, 파일 업로드가없는 경우 가장 쉬운 방법입니다.
Akalanka Weerasooriya

3

Axios에서 application / x-www-form-urlencoded 형식 사용

기본적으로, axios는 JavaScript 객체를 JSON으로 직렬화합니다. 대신 application / x-www-form-urlencoded 형식으로 데이터를 보내려면 다음 옵션 중 하나를 사용할 수 있습니다.

브라우저

브라우저에서 다음과 같이 URLSearchParams API를 사용할 수 있습니다.

const params = new URLSearchParams ();

params.append ( 'param1', 'value1');

params.append ( 'param2', 'value2');

axios.post ( '/ foo', 매개 변수);

URLSearchParams는 모든 브라우저에서 지원되지는 않지만 (caniuse.com 참조) 사용 가능한 폴리 필이 있습니다 (전역 환경을 폴리 필해야합니다).

또는 qs 라이브러리를 사용하여 데이터를 인코딩 할 수 있습니다.

const qs = require ( 'qs');

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

또는 다른 방법으로 (ES6)

'qs'에서 qs 가져 오기;

const 데이터 = { 'bar': 123};

const 옵션 = {

방법 : 'POST',

헤더 : { 'content-type': 'application / x-www-form-urlencoded'},

데이터 : qs.stringify (data),

url,};

축 (옵션);


3

2020 ES6 수행 방식

html 형식으로 데이터에 바인딩했습니다.

데이터:

form: {
   name: 'Joan Cap de porc',
   email: 'fake@email.com',
   phone: 2323,
   query: 'cap d\ou'
   file: null,
   legal: false
},

제출 :

async submitForm() {
  const formData = new FormData()
  Object.keys(this.form).forEach((key) => {
    formData.append(key, this.form[key])
  })

  try {
    await this.$axios.post('/ajax/contact/contact-us', formData)
    this.$emit('formSent')
  } catch (err) {
    this.errors.push('form_error')
  }
}

1

위의 방법은 저에게 효과적이지만 자주 필요한 것이기 때문에 평평한 물체에 기본 방법을 사용했습니다. 참고로, Vue를 사용하고 있었지만 REACT하지 않았습니다.

packageData: (data) => {
  const form = new FormData()
  for ( const key in data ) {
    form.append(key, data[key]);
  }
  return form
}

중첩 된 객체와 파일이있는보다 복잡한 데이터 구조가 나올 때까지 다음과 같은 결과를 얻었습니다.

packageData: (obj, form, namespace) => {
  for(const property in obj) {
    // if form is passed in through recursion assign otherwise create new
    const formData = form || new FormData()
    let formKey

    if(obj.hasOwnProperty(property)) {
      if(namespace) {
        formKey = namespace + '[' + property + ']';
      } else {
        formKey = property;
      }

      // if the property is an object, but not a File, use recursion.
      if(typeof obj[property] === 'object' && !(obj[property] instanceof File)) {
        packageData(obj[property], formData, property);
      } else {
        // if it's a string or a File
      formData.append(formKey, obj[property]);
      }
    }
  }
  return formData;
}

objectToFormData는 정의되어 있지 않으며 formData는 for 외부에 리턴되지만 for 내부에 정의됩니다. formData는 쉽지만 objectToFormData는 무엇입니까?
Trevor

나는 그것이 함수의 이름이라고 생각합니다. 내가 당신을 변경할 수 있습니다 가정, 그래서 재귀 적으로 의미가 있기 때문에 objectToFormDatapackageData또는 그 반대의 경우도 마찬가지
레이몬드 Ativie

0
import axios from "axios";
import qs from "qs";   

const url = "https://yourapplicationbaseurl/api/user/authenticate";
    let data = {
      Email: "testuser@gmail.com",
      Password: "Admin@123"
    };
    let options = {
      method: "POST",
      headers: { "content-type": "application/x-www-form-urlencoded" },
      data: qs.stringify(data),
      url
    };
    axios(options)
      .then(res => {
        console.log("yeh we have", res.data);
      })
      .catch(er => {
        console.log("no data sorry ", er);
      });
  };
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.