【问题标题】:Pass data Python to PHP via JSON通过 JSON 将数据 Python 传递给 PHP
【发布时间】:2012-10-27 06:33:30
【问题描述】:

我的项目范围是将某些值从 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
(
)

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

提前感谢您的友好回答。

【问题讨论】:

  • 您是否尝试过记录 PHP 脚本收到的 Content-Type?您正在发送“application/x-www-form-urlencoded”数据,如果它以“text/plain”的形式到达,它可能无法正常工作。 (但实际上,为什么你首先要对数据进行 URL 编码?为什么不直接发送“application/json”并将 JSON 作为 POST 数据发送?)
  • PS,你为什么一开始就用不同的语言来写前端和后端?这意味着有两倍的东西要学,两倍的东西可能会莫名其妙地出错。为什么不也用 Python 编写服务(或者,如果你真的必须用 PHP 编写客户端)?
  • PPS,看了你链接的博文,好像作者对网络服务的理解不如你,所以我建议寻找更好的教程。
  • @abarnert 我对 PHP 非常熟悉(监听器只是一个测试 :))但对 python 不太熟悉。我想说你通常是对的,匹配语言是一个好主意,但在这种情况下它不是。 python 脚本从 XML 中的温度探测器读取数据(这是一个计划任务),然后将其发布回 php 脚本?为什么这不能直接从 php 脚本完成?因为这个在基础设施之外的远程服务器上,没有不能带进去。 PS。在你问 SNMP 之前(安全不是我的问题:P)不是一个选项
  • 如果你对 PHP 比较了解……你能写一个命令行 PHP 脚本而不是 Python,还是远程机器没有安装命令行 PHP?

标签: php python json post http-post


【解决方案1】:

我会跳过 urlencoded 表单数据。只需在正文中发送原始数据:

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

然后你可以在 PHP 中读取请求正文:

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

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

【讨论】:

  • 好吧,这行得通!但是如何将其放入 post 变量中,例如: $_POST['results'] ?
  • @eldblz 为什么要把它放到$_POST['results']?就说$results = file_get_contents('php://input');
  • 是的,正如 abarnert 所说,您不需要 $_POST。当帖子内容类型是 url 编码的表单数据时,此变量只是一种方便。使用我的解决方案,帖子内容类型直接是数据。
  • 是的,这就是我正在做的谢谢,我已经添加了“Content-type”:“application/json”
【解决方案2】:

我用一个非常简单的 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,这不是绝对必要的)。

【讨论】:

猜你喜欢
  • 2018-02-13
  • 2010-11-29
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2023-01-18
相关资源
最近更新 更多