簡體   English   中英

相當於我的shell腳本curl命令的python'requests'API是什么?

[英]What is the python 'requests' api equivalent to my shell scripts curl command?

我有這個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。 我想我會使用pythonrequests包。 我在看這份文件:

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集。

result = requests.get(url,
        data=data, #whatever data
        headers=headers, #dict {"Content-Type":"application/json"}
        cert=(cacert,key),#key/cert pair 
        verify="cert_chain.pem" 
        )
print result.json() #depending on version of requests, json may be a function or a property

該鏈接會有所幫助

http://docs.python-requests.org/zh_CN/latest/user/advanced/#ssl-cert-verification

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM