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

巴扎黑
Freigeben: 2016-11-10 10:30:22
Original
2235 Leute haben es durchsucht

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}";  
    }
Nach dem Login kopieren

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')  
})
Nach dem Login kopieren

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()  
    }
Nach dem Login kopieren



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)  
}
Nach dem Login kopieren



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)));
Nach dem Login kopieren


Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!