4

私のプロジェクトの範囲は、python スクリプトからリモート php スクリプトに特定の値を渡すことです。

連想配列を生成する python スクリプトがあります。例 (すでに JSON エンコード済み):

{"FRONT": "19.50", "RACK": "17.63", "REAR": "21.06", "ROOM": "15.6"}

この連想配列をリモート PHP スクリプトに渡す必要があります。このチュートリアルに従いました: http://nonstopblah.wordpress.com/2010/07/13/python-to-php-via-json/

HTTP 応答で 200 を取得しますが、php スクリプトでは POST 変数が空のようです

ここに私のコード:

bulkData = json.dumps(temp, ensure_ascii = 'False')
# ensure_ascii is false as data is in unicode and not ascii encoding , use this if data is in any other encoding
print bulkData

print '\nHTTP Response'

headers = { "charset":"utf-8",
"Accept": "text/plain"}
conn = httplib.HTTPConnection(report_host)
postData = urllib.urlencode({'results':bulkData})
conn.request("POST", report_path, postData,headers)
response = conn.getresponse()
text = response.read()
print "Response status: ",response.status,"\n",text
conn.close()

これは PHP スクリプトです。

if( isset($_POST['results']) )
{
    $data = json_decode($_POST['results']);

    print_r($data);
}
else
{
    echo 'Nothing to listen.';
    print_r($_POST);
}

これは私のpythonスクリプトの出力です(リモート応答付き):

{"FRONT": "20.44", "RACK": "18.88", "REAR": "21.25", "ROOM": "17.7"}

HTTP Response
Response status:  200 
Nothing to listen.Array
(
)

それを行うよりスマートな方法はありますか?ここで何が欠けていますか?

親切な回答をいただきありがとうございます。

4

2 に答える 2

4

urlencoded フォーム データはスキップします。本体で生データを送信するだけです:

conn.request("POST", report_path, bulkData,headers)

次に、PHP でリクエスト本文を読み取ることができます。

<?
$data = json_decode(file_get_contents('php://input'));
?>

bulkData 文字列は、php スクリプトにそのまま到着します。

于 2012-11-07T08:51:17.370 に答える
0

私はこれを非常に単純なPHPCGIを使用してローカルでテストしましたが、問題を理解するのに数秒のデバッグしかかかりませんでした。

URLエンコードされたデータを送信していますが、Content-Typeを適切に設定していません。少なくともOSX10.7で設定されたapache2では、これはCGIがデータを変数の束ではなく1つの大きな文字列として認識することを意味します。そして明らかに、その文字列には「results」メンバーがありません。

ヘッダーに追加'Content-Type': 'application/x-www-form-urlencoded'すると、問題が解決します。または、POSTのデフォルトのコンテンツタイプを推測するようにWebサーバーを構成することもできます。/cgi-bin/*これは、同じ正味の効果があります。

ただし、本当の問題は、そもそもなぜデータをJSONエンコードとURLエンコードの両方にするのかということです。どちらも似たようなことをします。tempオブジェクトはすべてのキーと値の文字列を含むだけなので、dictURLエンコードするだけで、JSONを気にする必要はありません。または、JSONでエンコードbulkDataして、そのままPOSTデータとして送信することもできます(データ'Content-Type': 'application/json'を明示的に読み取って呼び出すjson_decodeため、厳密には必要ありませんが、理想的にはを使用します)。

于 2012-11-07T08:58:32.090 に答える