繁体   English   中英

如何通过Python发送的PHP中提取gzip POST请求

[英]How to extract a gzip POST request in PHP sent through Python

我试图用我的python脚本获得的结果填充数据库。 我在POST请求中发送gzip压缩数据。

PHP脚本在中间作为Web服务运行,需要提取gzip数据并获取“sql-query”并执行进一步的处理。

这就是我想在Python方面做的事情:

Sending a POST request using urllib:

# Data to be sent in POST request, it can be a SQL UPDATE/INSERT or SELECT
dictheaders = {'sql': "UPDATE 'logs' SET 'some_value' = Failed"}

# Encode the data
data = urllib.urlencode(dictheaders)

# Gzip compress the encoded data
IO = StringIO.StringIO()
gzip_data = gzip.GzipFile(fileobj=IO, mode='w')
gzip_data.write(data)
gzip_data.close()
gzip_data = IO.getvalue()

# This is the POST request being sent to a PHP web services file which
# needs to extract the gzipped query and then execute the query on SQL
f = urllib2.urlopen('http://x.x.x.x/example.php', gzip_data)

以下是我在PHP方面尝试的更改:

$postdata = file_get_contents("php://input");
$a = gzinflate(substr(substr($postdata, 10), 0, -8));
$sql = $a['sql'];

上面的代码似乎与我的Python代码不兼容。 这是在PHP中提取gzip POST请求的正确方法吗?

你使用了gzip.GzipFile ,它写了一个gzip文件头,你需要在将数据传递给gzinflate之前gzinflate它。 那么,通过代码的外观,你可能想要对它执行类似parse_str的操作:

$str = gzinflate(substr($postdata, 10, -8));
parse_str($str, $a);
echo $a['sql'];

另外,在你的python代码中,这行上有一个拼写错误或一个基本错误:

dictheaders = {'sql', 'SELECT * FROM employees'}

试试这个:

dictheaders = {'sql': 'SELECT * FROM employees'}

尝试替换这个:

# Gzip compress the encoded data
IO = StringIO.StringIO()
gzip_data = gzip.GzipFile(fileobj=IO, mode='w')
gzip_data.write(data)
gzip_data.close()
gzip_data = IO.getvalue()

有了这个:

gzip_data = zlib.compress(data)

当您真正想要的是压缩数据时,无需制作gzip文件。

PHP方面很好,只需删除不再需要的substr 但是 - 您将未压缩的字符串视为数组,这将无法正常工作。 您需要在PHP端解码查询字符串。 我个人只是使​​用JSON来做这些事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM