Node.jsはphpのcurl postデータreq.bodyが空の処理を取得します

巴扎黑
リリース: 2016-11-10 10:30:22
オリジナル
2250 人が閲覧しました

Nodeはphpのcurlデータを解析するためにexpress4とbody-parserを使用しますが、取得されたreq.bodyは{}であり、ヘッダーが設定されています

前提知識:

body-parserはmulti/formを解析する機能をサポートしていませんデータを渡したり、ファイルをアップロードしたりする場合は使用できません。

Node.js ボディ解析ミドルウェア

マルチパート ボディは複雑で通常は大きいため、次のモジュールに興味があるかもしれません:

busboy および connect-busboy
multiparty 。 connect-multiparty
formidable
multer
このモジュールは次のパーサーを提供します:

JSON ボディ パーサー
Raw ボディ パーサー
テキスト ボディ パーサー
URL エンコードされたフォーム ボディ パーサー

参照:
https://github.com/expressjs/ body-parser#bodyparserurlencodedoptions

PHP コード

Java コード

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}";  
    }
ログイン後にコピー

node コード

Java コード

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')  
})
ログイン後にコピー

指定された解析メソッドはまだ機能しません。 body-parser のソース コードに移動して、1 行ずつデバッグするだけです。

urlencode.js を検索します

Java コード

// determine if request should be parsed  
    if (!shouldParse(req)) {  
      return ('skip parsing'), next()  
    }
ログイン後にコピー



この行 shouldParse は false を返します
その後、type-is.js/index.js は false を返します。
var value = req.headers['content-type']


Java コード

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)  
}
ログイン後にコピー



ここで req.headers['content-type'] が multipart/form-data で、type が application であることがわかりました。 /x-www-form-urlencoded

PHP がcurlを実行すると、postDataは配列であり、データエンコーディングはmultipart/form-dataに設定されることがわかります

Javaコード

注:

パスCURLOPT_POSTFIELDS に配列を指定すると、cURL はデータを multipart/form-data にエンコードしますが、URL エンコードされた文字列を渡すと、データは application/x-www-form-urlencoded にエンコードされます。



PHPコードを変更する

Javaコード

curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode(json_encode($postData)));
ログイン後にコピー


関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート