我想知道如何将以下Curl命令转换为Python:
curl -G -H“接受:application / json” 'http://mydomain.com:8080/experimental/events' - data-urlencode 'query = [“=”,“certname”,“myserver”]'
我尝试了以下两个选项(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)
它不起作用但AGAIN,如果我做一个没有数据(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”]'
非常感谢任何帮助!
答案 0 :(得分: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
[...]
来自the manual:
-G, - get
使用时,此选项将使用-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
答案 1 :(得分:0)
有趣的是Curl
和Python
如何编码空格,两个结果应该完全相同。 好抓!
我将值替换为
values = {'query':'[“=”,“certname”,“myserver”]'}
然后生成了Curl
和Python
编码的内容,并且仍然看到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
修复了问题并在网址上对查询进行了硬编码,如下所示(代码不优雅,但现在正在运行:-))
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再次感谢你!