Skip to main content
 首页 » 编程设计

python之如何将 CURL 命令转换为 Python

2025年05月04日7EasonJim

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

非常感谢任何帮助!

请您参考如下方法:

您的 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

When used, this option will make all data specified with -d, --data or --data-binary to be used in an HTTP GET request instead of the POST request that otherwise would be used. The data will be appended to the URL with a '?' separator.

但是 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) 

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