web-dev-qa-db-fra.com

Publier des données de formulaire avec axios dans Node.js

Je teste l'API Uber sur Postman et je peux envoyer une demande avec les données de formulaire avec succès. Lorsque j'essaie de traduire cette requête à l'aide de Node.js et de la bibliothèque axios, un message d'erreur s'affiche. 

Voici à quoi ressemble ma demande de postier:

 Postman POST request

La réponse que je reçois est: { "error": "invalid_client" }

Voici ce que je fais dans Node.js et axios:

var axios = require("axios");

const config = { headers: { 'Content-Type': 'multipart/form-data' } };

axios.post('https://login.uber.com/oauth/v2/token', {
  client_id: '***',
  client_secret: '***',
  grant_type: 'authorization_code',
  redirect_uri: 'http://localhost:8080/',
  code: '***'
}, config)
  .then(function(response) {
    console.log(response.data)
  })
  .catch(function(error) {
    console.log(error)
  })

Lorsque je fais cela, je reçois une réponse de 400. 

J'ai ajouté l'en-tête 'multipart/form-data' parce que j'ai rempli les données du formulaire dans la requête Postman. Sans l'en-tête, j'obtiens le même résultat.

Je m'attends à recevoir la même réponse de Postman. Existe-t-il un problème avec ma variable de configuration dans le script Node.js? 

Toute aide serait appréciée!

9
Mike

Vous pourrez peut-être utiliser Content-Type: 'application/x-www-form-urlencoded'. J'ai rencontré un problème similaire avec https://login.microsoftonline.com où il était incapable de gérer le application/json entrant.

var axios = require("axios");

axios({
  url: 'https://login.uber.com/oauth/v2/token',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  data: `client_id=${encodeURIComponent('**')}&client_secret=${encodeURIComponent('**')}&grant_type=authorization_code&redirect_uri=${encodeURIComponent('http://localhost:8080/')}&code=${encodeURIComponent('**')}`
})
.then(function(response) {
  console.log(response.data)
})
.catch(function(error) {
  console.log(error)
})

Vous pouvez également utiliser une fonction pour gérer la traduction de formUrlEncoded comme

const formUrlEncoded = x =>
   Object.keys(x).reduce((p, c) => p + `&${c}=${encodeURIComponent(x[c])}`, '')

var axios = require("axios");

axios({
  url: 'https://login.uber.com/oauth/v2/token',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  data: formUrlEncoded({
     client_id: '***',
     client_secret: '***',
     grant_type: 'authorization_code',
     redirect_uri: 'http://localhost:8080/',
     code: '***' 
  })
})
.then(function(response) {
  console.log(response.data)
})
.catch(function(error) {
  console.log(error)
})
7
Reid Evans

En ce qui concerne le 10 juin 2017, la bibliothèque axios ne prend pas en charge la publication des données de formulaire dans Node.js. Voici le numéro sur GitHub - https://github.com/mzabriskie/axios/issues/789

Nous avons eu le même problème et avons décidé de passer à la bibliothèque request.

4
anuveyatsu

D'après l'erreur, il semble que votre client_id ou client_secret soit incorrect. Activez le débogage et partagez la demande/réponse brute (après le filtrage des informations d'identification).

1
Dustin Whittle

Ce n'est pas vrai! Vous pouvez poster des données avec axios en utilisant nodejs. Je l'ai fait. Le problème est que, si vous utilisez PHP côté serveur, vous devez être conscient du piège. Axios poste les données au format JSON (Content-Type: application/json) Le tableau $ _POST standard de PHP n'est pas renseigné lorsque ce type de contenu est utilisé. Donc, ce sera toujours vide. Pour que les paramètres de publication soient envoyés via une requête json, vous devez utiliser file_get_contents (" http: // php: // input ").

Un simple script PHP côté serveur serait:

if($_SERVER['REQUEST_METHOD']==='POST' && empty($_POST)) {
 $_POST = json_decode(file_get_contents('http://php://input'));
}

En utilisant cette méthode, vous pouvez éviter la dépendance formData. Vous POUVEZ publier des données directement à partir de node.js.

0
salihcenap