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/

我得到 200 的 HTTP 响应,但在 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

我用一个非常简单的 PHP CGI 在本地对此进行了测试,只需要几秒钟的调试就可以找出问题所在:

您正在发送 URL 编码的数据,但您没有正确设置 Content-Type。至少对于 OS X 10.7 上配置的 apache2,这意味着 CGI 将数据视为一个大字符串,而不是一堆变量。显然,该字符串没有“结果”成员。

添加'Content-Type': 'application/x-www-form-urlencoded'到您的标题可以解决问题。或者,您可以配置您的 Web 服务器以推断 POST 到的默认内容类型,例如,/cgi-bin/*具有相同的净效果。

然而,真正的问题是为什么你首先要对数据进行 JSON 编码和 URL 编码。他们都做类似的事情。由于您的temp对象只是dict包含所有键和值的字符串,因此您只需对其进行 URL 编码,而无需使用 JSON。或者,或者,只需采用 JSON 编码bulkData并将其作为 POST 数据原样发送(理想情况下使用'Content-Type': 'application/json',尽管由于您要明确地读取数据并调用json_decode它,这并不是绝对必要的)。

于 2012-11-07T08:58:32.090 回答