如何将CURL命令转换为Python

时间:2013-06-19 17:56:41

标签: python curl

我想知道如何将以下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”]'

非常感谢任何帮助!

2 个答案:

答案 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)

有趣的是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修复了问题并在网址上对查询进行了硬编码,如下所示(代码不优雅,但现在正在运行:-))

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再次感谢你!