通过JSON将数据Python传递给PHP

通过JSON将数据Python传递给PHP,php,python,json,post,http-post,Php,Python,Json,Post,Http Post,我的项目的范围是将某些值从python脚本传递到远程php脚本 我有一个生成关联数组的python脚本。例如(已经用JSON编码): 我需要将此关联数组传递给一个远程PHP脚本,我遵循了本教程: HTTP响应得到200,但在php脚本中,POST变量似乎是空的 这是我的代码: bulkData = json.dumps(temp, ensure_ascii = 'False') # ensure_ascii is false as data is in unicode and not asci

我的项目的范围是将某些值从python脚本传递到远程php脚本

我有一个生成关联数组的python脚本。例如(已经用JSON编码):

我需要将此关联数组传递给一个远程PHP脚本,我遵循了本教程:

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脚本的输出(带有远程响应):

有更聪明的方法吗?我错过了什么


提前感谢您的友好回答。

我将跳过URL编码的表单数据。只需在正文中发送原始数据:

conn.request("POST", report_path, bulkData,headers)
然后,您可以使用以下命令在PHP中读取请求正文:

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


bulkData字符串将按php脚本中的原样到达。

我用一个非常简单的php CGI在本地进行了测试,只花了几秒钟的调试就解决了问题:

您正在发送URL编码的数据,但未正确设置内容类型。至少在OSX10.7上配置apache2时,这意味着CGI将数据视为一个大字符串,而不是一堆变量。显然,该字符串没有“results”成员

“Content-Type”:“application/x-www-form-urlencoded”
添加到您的标题中可以解决此问题。或者,您可以将web服务器配置为推断到的帖子的默认内容类型,例如,
/cgi-bin/*
,这具有相同的净效果


然而,真正的问题是,为什么首先要对数据进行JSON编码和URL编码。他们都做相似的事情。由于您的
temp
对象只是一个
dict
,包含所有键和值的字符串,因此您可以对其进行URL编码,而不必使用JSON。或者,也可以将JSON编码的
bulkData
作为POST数据发送(理想情况下使用
'Content-Type':'application/JSON'
,尽管由于您要显式地读取数据并在其上调用
JSON\u decode
,这并不是绝对必要的).

您是否尝试记录PHP脚本接收到的
内容类型?您正在发送“application/x-www-form-urlencoded”数据,如果该数据以“text/plain”的形式到达,则可能无法工作。(但事实上,为什么您首先要对数据进行URL编码?为什么不发送“application/json”并将json作为POST数据发送?)PS,为什么您首先要用不同的语言编写前端和后端,这两种语言您都不太熟悉?这意味着有两倍的东西要学,两倍的东西会神秘地出错。为什么不也用Python编写服务(或者,如果你真的必须的话,用PHP编写客户端)?PPS,看看你链接的博客文章,作者似乎不比你更了解web服务,所以我建议你找一个更好的教程。@abarnert我对PHP很熟悉(监听器只是一个测试:))但python就不是这样了。我想说你基本上是对的,匹配语言是个好主意,但在这种情况下不是。python脚本从XML中的温度探测器读取数据(这是一个计划任务),然后将其发回php脚本?为什么不能直接从php脚本执行此操作?因为它位于基础架构外部的远程服务器上,不能将任何文件带到内部。另外,在您询问SNMP之前(安全不是我的问题:P)不是一个选项如果您对PHP了解得更多…您可以编写一个命令行PHP脚本而不是Python,或者远程机器没有安装命令行PHP吗?好的,这很有效!但是如何将其放入post变量,例如:$\u post['results']?@eldblz为什么要将其放入
$\u post['results']
?只需说
$results=file\u get\u contents('php://input');是的,正如abarnert所说,您不需要
$\u POST
。当post内容类型是url编码的表单数据时,此变量只是一种方便。在我的解决方案中,帖子内容类型直接是数据。是的,这就是我正在做的,谢谢,我添加了“内容类型”:“application/json”,你有这样一个工作示例吗?我自己也有类似的问题:
conn.request("POST", report_path, bulkData,headers)
<?
$data = json_decode(file_get_contents('php://input'));
?>