Skip to main content
 首页 » 编程设计

python之什么是 python 'requests' api 等效于我的 shell 脚本 curl 命令

2025年05月04日16lvdongjie

我有这个 curl 命令,我使用的是 shell 脚本:

curl -X POST -H 'Content-Type: application/json' \ 
--cert /etc/puppetlabs/puppet/ssl/certs/${PEFQDN}.pem \ 
--key /etc/puppetlabs/puppet/ssl/private_keys/${PEFQDN}.pem \ 
--cacert /etc/puppetlabs/puppet/ssl/certs/ca.pem \ 
--data "{ \"name\": \"$GROUP\", \"parent\": \"00000000-0000-4000-8000-000000000000\", \"environment\": \"production\", \"classes\": { \"$CLASS\": {}} }" \ 
https://${PEFQDN}:4433/classifier-api/v1/groups | python -m json.tool 

我想摆脱我的 shell 脚本,因为我需要能够处理从 REST API 返回的一些复杂的 json。我想我会使用 python 和 requests 包。我正在查看此文档:

http://docs.python-requests.org/en/latest/user/quickstart/

但我看不到在哪里可以指定我的证书信息。在我的 shell 脚本中,我可以传递 curl 这些选项:--cert、--key、--cacert .我不知道如何使用 python 的 requests API 完成相同的任务。有谁知道我如何才能做到这一点?

更新:谢谢乔兰。这是我尝试编写一个 python 脚本来执行此操作:

#!/usr/bin/env python 
 
import requests 
 
# curl https://${PEFQDN}:4433/classifier-api/v1/groups \ 
# -H "Content-Type: application/json" \ 
# --cert /etc/puppetlabs/puppet/ssl/certs/${PEFQDN}.pem \ 
# --key /etc/puppetlabs/puppet/ssl/private_keys/${PEFQDN}.pem \ 
# --cacert /etc/puppetlabs/puppet/ssl/certs/ca.pem | python -m json.tool 
 
url='https://my-pm.example.com:4433/classifier-api/v1/groups' 
headers = {"Content-Type: application/json"} 
data={} 
cacert='/etc/puppetlabs/puppet/ssl/certs/ca.pem' 
key='/etc/puppetlabs/puppet/ssl/private_keys/my-pm.example.com.pem' 
cert='/etc/puppetlabs/puppet/ssl/certs/my-pm.example.com.pem' 
result = requests.get(url, 
        data=data, #whatever data 
        headers=headers, #dict {"Content-Type":"application/json"} 
        verify=cert, 
        cert=(cacert,key) #key/cert pair  
        ) 
print result.json() 

我一定做错了什么,因为这是我得到的输出......

# ./add-group.py  
Traceback (most recent call last): 
  File "./add-group.py", line 21, in <module> 
    cert=(cacert,key) #key/cert pair  
  File "/usr/lib/python2.7/site-packages/requests-2.7.0-py2.7.egg/requests/api.py", line 69, in get 
    return request('get', url, params=params, **kwargs) 
  File "/usr/lib/python2.7/site-packages/requests-2.7.0-py2.7.egg/requests/api.py", line 50, in request 
    response = session.request(method=method, url=url, **kwargs) 
  File "/usr/lib/python2.7/site-packages/requests-2.7.0-py2.7.egg/requests/sessions.py", line 451, in request 
    prep = self.prepare_request(req) 
  File "/usr/lib/python2.7/site-packages/requests-2.7.0-py2.7.egg/requests/sessions.py", line 382, in prepare_request 
    hooks=merge_hooks(request.hooks, self.hooks), 
  File "/usr/lib/python2.7/site-packages/requests-2.7.0-py2.7.egg/requests/models.py", line 293, in prepare 
    self.prepare_headers(headers) 
  File "/usr/lib/python2.7/site-packages/requests-2.7.0-py2.7.egg/requests/models.py", line 401, in prepare_headers 
    self.headers = CaseInsensitiveDict((to_native_string(name), value) for name, value in headers.items()) 
AttributeError: 'set' object has no attribute 'items' 

我做错了什么?

谢谢

请您参考如下方法:

headers = {"Content-Type: application/json"} 

应该改为

headers = {"Content-Type": "application/json"} 

看起来请求 API 需要一个字典,而 {"Content-Type: application/json"} 显然是一个 Python 集合。