3

我想知道如何将以下 Curl 命令转换为 Python:

curl -G -H "Accept: application/json" ' http://mydomain.com:8080/experimental/events ' --data-urlencode 'query=["=", "certname", "myserver"]'

我尝试了以下 2 个选项(1:使用 httlib 和 2:使用 urllib2):

选项 1:使用 httlib

import httplib, urllib
connection = httplib.HTTPConnection('mydomain.com', 8080)
headers = {'Content-type': 'application/json'}
values = {"query": "['=', 'certname', 'myserver']"}
data = urllib.urlencode(values)
connection.request('POST', '/experimental/events', data, headers)  
response = connection.getresponse()

它不起作用,但如果我做一个没有数据(urlencode)的简单请求,例如 connection.request('POST', '/facts/myserver', None, headers)

注释:'/experimental/events' 需要 --data-urlencode 但 '/facts/myserver' 不需要 --data-urlencode

选项 2:使用 urllib2

import urllib2, urllib
values = {"query": "['=', 'certname', 'myserver']"}
data = urllib.urlencode(values)
url_path = "http://mydomain.com:8080/experimental/events"
server_request = urllib2.Request(url_path, data)
server_request.add_header('Content-type', 'Accept: application/json')
server_response = urllib2.urlopen(server_request)

它不起作用,但再次,如果我做一个没有数据(urlencode)的简单请求,例如 url_path =“ http://mydomain.com:8080/facts/myserver ”然后 server_request = urllib2.Request(url_path)

注释:'/experimental/events' 需要 --data-urlencode 但 '/facts/myserver' 不需要 --data-urlencode

我被这种类型卡住了 --data-urlencode 'query=["=", "certname", "myserver"]'

任何帮助是极大的赞赏!

4

2 回答 2

1

您的curl命令正在执行 GET:

$ curl -v -G -H "Accept: application/json" 'http://example.com/experimental/events' --data-urlencode 'query=["=", "certname", "myserver"]'
* About to connect() to example.com port 80 (#0)
*   Trying 192.0.43.10... connected
> GET /experimental/events?query=%5B%22%3D%22%2C%20%22certname%22%2C%20%22myserver%22%5D HTTP/1.1
[...]

手册

-G,--得到

使用时,此选项将使所有使用 -d、--data 或 --data-binary 指定的数据在 HTTP GET 请求中使用,而不是在其他情况下使用的 POST 请求中使用。数据将附加到带有“?”的 URL 分隔器。

但是 Python 版本正在做一个POST. 如果你做一个,它会起作用GET吗?

url_path = "https://.../events?" + data
server_request = urllib2.Request(url_path)

两者之间唯一的其他区别是 Python 将空格编码为+并且curl正在使用%20. 它们应该被同等对待,但如果你的服务器写得不好,它可能是你的问题的原因:

import urllib2, urllib
values = {"query": "['=', 'certname', 'myserver']"}
data = urllib.urlencode(values)
print(data)

查询=%5B%27%3D%27%2C+%27certname%27%2C+%27myserver%27%5D

于 2013-06-19T18:10:51.160 回答
0

有趣的是如何CurlPython正在编码空间,两个结果应该是相同的。接得好!

我将值替换为

values = {'query': '["=", "certname", "myserver"]'}

然后生成什么CurlPython正在编码,仍然看到 Python 将空格编码为+(不喜欢这样)

Curl

查询=%5B%22%3D%22%2C%20%22certname%22%2C%20%22myserver%22%5D

Python

查询=%5B%22%3D%22%2C+%22certname%22%2C+%22myserver%22%5D

我使用一个“修复”了这个问题,Curl并将查询硬编码在 url 上,如下所示(代码并不优雅,但它现在可以工作了:-))

import httplib
connection = httplib.HTTPConnection('mydomain.com', 8080)
headers = {'Content-type': 'application/json'}
connection.request('GET', "/experimental/events?query=%5B%22%3D%22%2C%20%22certname%22%2C%20%22" + myserver + "%22%5D", None, headers)
response = connection.getresponse()

Brendan Long再次感谢您!

于 2013-06-19T20:14:39.950 回答