Heim  >  Artikel  >  Backend-Entwicklung  >  Node.js erhält die Verarbeitung von PHP-Curl-Post-Daten, bei denen req.body leer ist

Node.js erhält die Verarbeitung von PHP-Curl-Post-Daten, bei denen req.body leer ist

巴扎黑
巴扎黑Original
2016-11-10 10:30:222250Durchsuche

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[&#39;content-type&#39;]  
  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)));


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn