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:
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!
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)
})
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.
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).
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.