it-swarm.com.de

Veröffentlichen Sie Formulardaten mit Axios in Node.js

Ich teste die Uber-API auf Postman und kann eine Anfrage mit Formulardaten erfolgreich senden. Wenn ich versuche, diese Anfrage mit Node.js und der Axios-Bibliothek zu übersetzen, erhalte ich eine Fehlermeldung. 

So sieht mein Postman-Antrag aus:

 Postman POST request

Die Antwort, die ich erhalte, ist: { "error": "invalid_client" }

Folgendes mache ich in Node.js und 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)
  })

Wenn ich das tue, bekomme ich eine Antwort von 400. 

Ich habe den 'multipart/form-data'-Header hinzugefügt, weil ich die Formulardaten in der Postman-Anfrage ausgefüllt habe. Ohne Header bekomme ich dasselbe Ergebnis.

Ich erwarte, dass ich dieselbe Antwort bekomme, die ich von Postman bekomme. Stimmt etwas mit meiner Konfigurationsvariablen im Skript Node.js? 

Jede Hilfe wäre dankbar!

9
Mike

Möglicherweise können Sie Content-Type: 'application/x-www-form-urlencoded' verwenden. Ich hatte ein ähnliches Problem mit https://login.microsoftonline.com, bei dem eingehende application/json nicht verarbeitet werden konnte.

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

Sie können auch eine Funktion verwenden, um die Übersetzung in formUrlEncoded wie folgt zu behandeln

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

Mit Stand vom 10. Juni 2017 unterstützt die Bibliothek axios keine Veröffentlichung von Formulardaten in Node.js. Hier ist die Ausgabe auf GitHub - https://github.com/mzabriskie/axios/issues/789

Wir hatten das ähnliche Problem und beschlossen, zur Bibliothek request zu wechseln.

4
anuveyatsu

Aufgrund des Fehlers scheint Ihre client_id oder client_secret falsch zu sein. Aktivieren Sie das Debugging und geben Sie die unformatierte Anforderung/Antwort frei (nachdem Sie die Anmeldeinformationen herausgefiltert haben).

1
Dustin Whittle

Es ist nicht wahr! Sie können Daten mit Axios über nodejs buchen. Ich habe es getan. Das Problem ist, wenn Sie PHP auf der Serverseite verwenden, gibt es eine Gefahr, die Sie beachten müssen. Axios stellt Daten im JSON-Format bereit (Content-Type: application/json) Das Standard-Array $ _POST von PHP wird nicht gefüllt, wenn dieser Inhaltstyp verwendet wird. So bleibt es immer leer. Um über eine Json-Anfrage gesendete Post-Parameter abzurufen, müssen Sie file_get_contents (" http: // php: // input ") verwenden.

Ein einfaches PHP Skript auf der Serverseite wäre:

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

Mit dieser Methode können Sie die Abhängigkeit von formData vermeiden. Sie CAN können Daten direkt aus node.js.

0
salihcenap