Post-request для отправки данных формы

Вардар POST запрос ударять URL на контроллере, но установка нулевых значений в мой класс POJO, когда я иду с помощью инструментов разработчика в хроме, полезная нагрузка содержит данные. Что я делаю неправильно?

Axios POST Запрос:

var body = {
    userName: 'Fred',
    userEmail: '[email protected]'
}

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

Ответ браузера:

enter image description here

Если я установлю заголовки как:

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

Запрос выдает ошибку

Ошибка в публикации multipart/form-data. В заголовке Content-Type отсутствует граница

Если я делаю тот же запрос в почтальоне, он работает нормально и устанавливает значения для моего класса POJO.

Может кто-нибудь объяснить, как установить границу или как я могу отправить данные формы с помощью Axios.

Ответ 1

Вы можете опубликовать данные axios с помощью FormData(), например:

var bodyFormData = new FormData();

А затем добавьте поля в форму, которую вы хотите отправить:

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

Если вы загружаете изображения, вы можете использовать .append

bodyFormData.append('image', imageFile); 

И тогда вы можете использовать метод сообщения Axios (вы можете изменить его соответствующим образом)

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

Вы можете прочитать больше здесь

Ответ 2

В моем случае мне пришлось добавить границу к заголовку, как показано ниже:

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

Проверьте строку запроса.

Вы можете использовать его следующим образом:

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

Ответ 4

Загрузить (несколько) двоичных файлов

Ситуация усложняется, когда вы хотите опубликовать файлы через multipart/form-data, особенно несколько двоичных файлов. Ниже приведен рабочий пример:

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

const formData = new FormData()
formData.append('json', JSON.stringify({ to: [{ phoneNumber: process.env.RINGCENTRAL_RECEIVER }] }), 'test.json')
formData.append('attachment', fs.createReadStream(path.join(__dirname, 'test.png')), 'test.png')
formData.pipe(concat({ encoding: 'buffer' }, async data => {
  const r = await rc.post('/restapi/v1.0/account/~/extension/~/fax', data, {
    headers: formData.getHeaders()
  })
  console.log(r.data)
}))
  • Вместо headers: {'Content-Type': 'multipart/form-data' } Я предпочитаю headers: formData.getHeaders()
  • Мне нужно использовать concat-stream для объединения нескольких файловых потоков
  • Я использую async и await выше, вы можете изменить их на простые заявления Promise, если они вам не нравятся

Ответ 5

Вышеупомянутый метод работал для меня, но так как это было то, что мне часто требовалось, я использовал базовый метод для плоских объектов. Обратите внимание, я также использовал 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)) {
        objectToFormData(obj[property], formData, property);
      } else {
        // if it a string or a File
      formData.append(formKey, obj[property]);
      }
    }
  }
  return formData;
}

Ответ 6

Еще проще:

axios.post('/addUser',{
    userName: 'Fred',
    userEmail: '[email protected]'
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

Ответ 7

Вы можете попробовать это:

    axio.post('/contractor-management/contractor/firm/addNewProjectInFirm',{
        method: 'post',
        url: 'http://www.yourserver.com/upload',
        data: {
                  project_id: values.projectId,
                  id: values.selectedProjectId,
                   role: values.userRole,
               },
        headers: {
        'content-type': 'multipart/form-data; boundary=${form._boundary}',
                 },

                })
        .catch(error=> {
               console.log('error', error);
        }
     );