374 votes

axios post request pour envoyer les données du formulaire

axios POST La requête atteint l'url sur le contrôleur mais donne des valeurs nulles à ma classe POJO. Lorsque je passe par les outils de développement dans Chrome, la charge utile contient des données. Qu'est-ce que je fais de mal ?

Requête POST d'Axios :

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);
});

Réponse du navigateur :

enter image description here

Si je configure les en-têtes comme :

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

La requête génère l'erreur suivante

Erreur dans l'affichage de multipart/form-data. L'en-tête Content-Type n'est pas délimité

Si je fais la même demande dans postman, cela fonctionne bien et définit des valeurs pour ma classe POJO.

Quelqu'un peut-il expliquer comment définir les limites ou comment envoyer les données du formulaire en utilisant axios.

579voto

Aaqib Points 4255

Vous pouvez afficher les données axios en utilisant FormData() comme :

var bodyFormData = new FormData();

Puis, ajoutez les champs au formulaire que vous voulez envoyer :

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

Si vous téléchargez des images, vous pouvez utiliser la méthode suivante .append

bodyFormData.append('image', imageFile); 

Et ensuite vous pouvez utiliser la méthode axios post (vous pouvez la modifier en conséquence).

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);
    });

Vous pouvez lire la suite Ici

9 votes

BodyFormData.set n'est pas une fonction j'ai eu cette erreur

17 votes

Vous devez utiliser append au lieu de set.

1 votes

@ManojBhardwaj vous devez lier la fonction, supposez que si vous faites une demande dans la fonction submit vous devez lier cette fonction. ex:- onSubmit={this.submit(bind(this)} ou ex:- dans le constructor constructor(super){ this.submit = this.submit.bind(this) ; } submit(){ axios({}) ;... }

85voto

Luiz Dias Points 453

Dans mon cas, j'ai dû ajouter le frontière à la en-tête comme les suivantes :

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}`,
        },
    });

Cette solution est également utile si vous travaillez avec React Native.

6 votes

Cela a résolu mon problème lorsque j'essayais de poster sur l'api d'Imgur. Ce n'est mentionné nulle part dans la documentation, mais sans cela, vous obtenez une réponse 400 Invalid URL.

8 votes

FormData._boundary n'est pas défini dans Chrome 76 et Firefox 67, et l'option axios supprime l'en-tête Content-Type de toute façon donc cela ne devrait pas avoir d'effet.

3 votes

La partie frontière était la seule chose qui manquait à mon code, elle a fonctionné parfaitement dans node !

51voto

cclient Points 49

Vérifiez chaîne d'interrogation .

Vous pouvez l'utiliser comme suit :

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

4 votes

C'est encore mieux dans un environnement de nœuds

0 votes

Si vous avez des objets imbriqués dans vos données, il se peut que la "querystring" ne fonctionne pas comme prévu. Dans ce cas, vous pouvez utiliser le module 'qs' pour filtrer les données.

3 votes

Ce ne sont pas des données de formulaire. Il s'agit d'un format de formulaire codé en url.

33voto

Tyler Long Points 1216

Télécharger des fichiers binaires (multiples)

Les choses se compliquent lorsque vous voulez poster des fichiers via multipart/form-data notamment des fichiers binaires multiples. Voici un exemple de fonctionnement :

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)
}))
  • Au lieu de headers: {'Content-Type': 'multipart/form-data' } Je préfère headers: formData.getHeaders()
  • J'ai besoin d'utiliser concat-stream pour concaténer plusieurs flux de fichiers
  • J'utilise async et await ci-dessus, vous pouvez les changer en déclarations Promise si vous ne les aimez pas.

2 votes

Merci beaucoup pour cet exemple, j'ai eu du mal à comprendre pourquoi le téléchargement de plusieurs fichiers ne fonctionnait pas.

1 votes

Je ne suis pas un expert, mais dans mon cas, j'ai réussi à éviter ces complications ( concat-stream , async et await ) pour le téléchargement de plusieurs fichiers en utilisant for(var x = 0; x<this.state.files.length; x++) { formData.append('files[]', this.state.files[x]) } afin que je puisse soumettre en utilisant axios.post(url, formData, config)

1 votes

@laimison merci, cela fonctionne pour moi. J'ai mis à jour ma réponse.

7voto

thomasL Points 101

Encore plus simple :

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

7 votes

Oui, comme il semble, s'il n'y a pas de téléchargement de fichiers, c'est le moyen le plus simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X