Heim > Artikel > Backend-Entwicklung > Node.js erhält die Verarbeitung von PHP-Curl-Post-Daten, bei denen req.body leer ist
Knoten verwendet Express4 und Body-Parser, um PHP-Curl-Daten zu analysieren, aber der erhaltene req.body ist {} und der Header ist festgelegt
Voraussetzungswissen:
Body-Parser tut es Nicht unterstützt die Funktion zum Parsen von Multi-/Formulardaten. Wenn Sie Binärdaten übergeben oder Dateien hochladen, können Sie sie nicht verwenden.
Node.js Body-Parsing-Middleware
Aufgrund ihrer komplexen und typischerweise großen Beschaffenheit sind die folgenden Module möglicherweise für Sie von Interesse:
busboy und connect-busboy
multiparty und connect-multiparty
formidable
multer
Dieses Modul stellt die folgenden Parser bereit:
JSON-Body-Parser
Raw-Body-Parser
Textkörperparser
URL-codierter Formularkörperparser
Referenz:
https://github.com/expressjs/body-parser#bodyparserurlencodedoptions
PHP-Code
Java-Code
function addCurl($url, $type="get", $postData=null) { $ch = curl_init(); $headers[] = 'Connection: Keep-Alive'; $headres[] = 'Content-Type: application/x-www-form-urlencoded;charset=utf-8'; $headers[] = 'Content-Length: ' . strlen(json_encode($postData)); //$headres[] = 'Content-Type: application/json'; //$headres[] = 'Content-Type: text/html'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($type=="get") { curl_setopt($ch, CURLOPT_POST, 0); } else { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode(json_encode($postData))); } curl_setopt($ch, CURLOPT_URL, $url); $data = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if (curl_errno($ch)) { echo 'Curl error: ' . curl_error($ch) . PHP_EOL; curl_close($ch); return false; } curl_close($ch); return ($code == 200) ? $data : "server error,code: . {$code}"; }
Knotencode
Java-Code
var express = require('express') var bodyParser = require('body-parser') var app = express() var urlencodedParser = bodyParser.urlencoded({ extended: false }) app.use(urlencodedParser, function (req, res) { res.setHeader('Content-Type', 'text/plain') res.write('you posted:\n') res.end(JSON.stringify(req.body, null, 2)) }) app.listen(3000, function() { console.log('Server is running') })
Es funktioniert immer noch nicht, selbst wenn die Die Parsing-Methode ist angegeben. Gehen Sie einfach zum Quellcode des Body-Parsers und debuggen Sie ihn Zeile für Zeile.
Urlencode.js finden
Java-Code
// determine if request should be parsed if (!shouldParse(req)) { return ('skip parsing'), next() }
Diese Zeile sollte „false“ zurückgeben
und dann zu „type-is“ wechseln .js/index.js gibt false zurück.
var value = req.headers['content-type']
Java-Code
function typeofrequest(req, types_) { var types = types_ // no body if (!hasbody(req)) { return null } // support flattened arguments if (arguments.length > 2) { types = new Array(arguments.length - 1) for (var i = 0; i < types.length; i++) { types[i] = arguments[i + 1] } } // request content type var value = req.headers['content-type'] return typeis(value, types) }
Hier zu finden Die req.headers['content-type'] sind multipart/form-data und der Typ ist application/x-www-form-urlencoded
Es stellt sich heraus, dass postData ein Array ist, wenn PHP Curl ausführt. Dadurch wird die Datenkodierung auf Multipart/Form-Daten gesetzt
Java-Code
Hinweis:
Übergeben Sie ein Array an CURLOPT_POSTFIELDS, cURL kodiert das Daten in multipart/form-data umwandeln. Bei der Übergabe einer URL-codierten Zeichenfolge werden die Daten jedoch als application/x-www-form-urlencoded codiert.
Ändern Sie den pHP-Code
Java-Code
curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode(json_encode($postData)));