使用需要承载令牌的API在Python中进行API调用

使用需要承载令牌的API在Python中进行API调用,python,python-2.7,curl,ibm-cloud,pycurl,Python,Python 2.7,Curl,Ibm Cloud,Pycurl,正在寻找将JSON API调用集成到Python程序中的帮助 我希望将以下API集成到Python.py程序中,以允许调用它并打印响应 API指导说明必须生成承载令牌以允许调用API,我已经成功地完成了这一点。但是,我不确定在pythonapi请求中包含此令牌作为承载令牌身份验证的语法 我可以使用包含令牌的cURL成功完成上述请求。我尝试过“urllib”和“requests”路由,但都没有用 完整的API详细信息:这只是意味着它希望将其作为标头数据中的键 import requests end

正在寻找将JSON API调用集成到Python程序中的帮助

我希望将以下API集成到Python.py程序中,以允许调用它并打印响应

API指导说明必须生成承载令牌以允许调用API,我已经成功地完成了这一点。但是,我不确定在pythonapi请求中包含此令牌作为承载令牌身份验证的语法

我可以使用包含令牌的cURL成功完成上述请求。我尝试过“urllib”和“requests”路由,但都没有用


完整的API详细信息:

这只是意味着它希望将其作为标头数据中的键

import requests
endpoint = ".../api/ip"
data = {"ip": "1.1.2.3"}
headers = {"Authorization": "Bearer MYREALLYLONGTOKENIGOT"}

print(requests.post(endpoint, data=data, headers=headers).json())

令牌必须按照以下格式放置在授权标头中:

授权:持票人[代币价值]

代码如下:
如果您使用的是
请求
模块,另一种选择是编写一个auth类,如“”中所述:

然后你能发送这样的请求吗

response = requests.get('https://www.example.com/', auth=BearerAuth('3pVzwec1Gs1m'))
它允许您像使用基本auth一样使用相同的
auth
参数,并且在某些情况下可能会对您有所帮助。

下面是用cURL和Python实现的完整示例—用于授权和进行API调用 卷曲 1。授权

您已收到如下访问数据:

Username: johndoe

Password: zznAQOoWyj8uuAgq

Consumer Key: ggczWttBWlTjXCEtk3Yie_WJGEIa

Consumer Secret: uuzPjjJykiuuLfHkfgSdXLV98Ciga
curl -k -d "grant_type=password&username=Username&password=Password" \

                    -H "Authorization: Basic Base64(consumer-key:consumer-secret)" \

                       https://somedomain.test.com/token
您可以这样调用cURL:

Username: johndoe

Password: zznAQOoWyj8uuAgq

Consumer Key: ggczWttBWlTjXCEtk3Yie_WJGEIa

Consumer Secret: uuzPjjJykiuuLfHkfgSdXLV98Ciga
curl -k -d "grant_type=password&username=Username&password=Password" \

                    -H "Authorization: Basic Base64(consumer-key:consumer-secret)" \

                       https://somedomain.test.com/token
或者在这种情况下:

curl -k -d "grant_type=password&username=johndoe&password=zznAQOoWyj8uuAgq" \

                    -H "Authorization: Basic zzRjettzNUJXbFRqWENuuGszWWllX1iiR0VJYTpRelBLZkp5a2l2V0xmSGtmZ1NkWExWzzhDaWdh" \

                      https://somedomain.test.com/token
答案大概是这样的:

{
    "access_token": "zz8d62zz-56zz-34zz-9zzf-azze1b8057f8",
    "refresh_token": "zzazz4c3-zz2e-zz25-zz97-ezz6e219cbf6",
    "scope": "default",
    "token_type": "Bearer",
    "expires_in": 3600
}
2。调用API

下面是如何从上面调用一些使用身份验证的API
Limit
offset
只是API可以实现的两个参数的示例。 您需要在
“Bearer”
之后插入上面的
访问\u令牌

curl -k -X GET "https://somedomain.test.com/api/Users/Year/2020/Workers?offset=1&limit=100" -H "accept: application/json" -H "Authorization: Bearer zz8d62zz-56zz-34zz-9zzf-azze1b8057f8"
python 上面的内容也是用Python实现的。我在注释中添加了文本,这样代码就可以被复制粘贴

# Authorization data

import base64
import requests

username = 'johndoe'
password= 'zznAQOoWyj8uuAgq'
consumer_key = 'ggczWttBWlTjXCEtk3Yie_WJGEIa'
consumer_secret = 'uuzPjjJykiuuLfHkfgSdXLV98Ciga'
consumer_key_secret = consumer_key+":"+consumer_secret
consumer_key_secret_enc = base64.b64encode(consumer_key_secret.encode()).decode()

# Your decoded key will be something like:
#zzRjettzNUJXbFRqWENuuGszWWllX1iiR0VJYTpRelBLZkp5a2l2V0xmSGtmZ1NkWExWzzhDaWdh


headersAuth = {
    'Authorization': 'Basic '+ str(consumer_key_secret_enc),
}

data = {
  'grant_type': 'password',
  'username': username,
  'password': password
}

## Authentication request

response = requests.post('https://somedomain.test.com/token', headers=headersAuth, data=data, verify=True)
j = response.json()

# When you print that response you will get dictionary like this:

    {
        "access_token": "zz8d62zz-56zz-34zz-9zzf-azze1b8057f8",
        "refresh_token": "zzazz4c3-zz2e-zz25-zz97-ezz6e219cbf6",
        "scope": "default",
        "token_type": "Bearer",
        "expires_in": 3600
    }

# You have to use `access_token` in API calls explained bellow.
# You can get `access_token` with j['access_token'].


# Using authentication to make API calls   

## Define header for making API calls that will hold authentication data

headersAPI = {
    'accept': 'application/json',
    'Authorization': 'Bearer '+j['access_token'],
}

### Usage of parameters defined in your API
params = (
    ('offset', '0'),
    ('limit', '20'),
)

# Making sample API call with authentication and API parameters data

response = requests.get('https://somedomain.test.com/api/Users/Year/2020/Workers', headers=headersAPI, params=params, verify=True)
api_response = response.json()

使用环境变量

时,上述操作会引发以下语法错误:
回溯(最近一次调用):print requests.post(endpoint,data=data,headers=headers)中第6行的文件“bearerreturn.py”。json()TypeError:“dict”对象不可调用
下面的代码:
导入请求端点="https://xforce-api.mybluemix.net:443/api/ip“data={“ip”:“1.1.2.3”}headers={“Bear token”:“token WAS INSERTED HERE”}打印请求。post(endpoint,data=data,headers=headers)。json()
有什么想法吗?您有一个旧版本的请求…
json
在您的版本中是一个dict,而不是一个函数
请求。post(…).json
…不要调用itThanks Joran Beasley。通过pip更新了请求库,这允许我保留原始语法。但是,现在当我运行上面的命令时,它会输出以下内容。json响应:
{u'error':u'Not authorized。只允许通过https://exchange.xforce.ibmcloud.com/#/'}
这与我在浏览器中直接点击URL相同。我是否缺少令牌或端点配置方式?代码:
import requests endpoint=”https://xforce-api.mybluemix.net:443/ipr/“数据={”ip:“1.1.2.3”}头文件={“承载令牌”:“令牌\此处”}打印请求。post(端点,数据=数据,头文件=头文件)。json()
不幸的是,我实在帮不上忙……要么是端点不正确,要么是您的凭据无效(您是否使用的是仅为其url配置的示例令牌?)或者你可能需要将你的应用程序url放在他们的deleoper面板中,以获取你的代码…很可能这是你的第一个令牌…你需要将令牌交换为刷新令牌,然后你可以使用刷新令牌来获得更永久的令牌(至少oauth2通常是这样工作的..)哎哟,看起来我的头是错误的,请尝试Python3的更新代码:
req=urllib.request.request(urlstr,None,{“Authorization”:“承载者%s”%enc_authstr})response=urllib.request.urlopen(req)
这对zeep也可能有用。它使用requests.auth类型的授权(对于http头auth,而不是soap头)
import json
import os
import requests

def lambda_handler(event, context):
    print(event)
    item = list(map(lambda x: x['detail']['item'], event['inputData']))
    print("item List :", item)
    consumer_key = os.getenv('consumer_key')
    consumer_secret = os.getenv('consumer_secret')
    entitlement_url=os.getenv('entitlement_url')
    storage_url=os.getenv('storage_url')
    access_token = get_jwt_token(consumer_key,consumer_secret,entitlement_url)
    print("Response from entitlement: ", access_token)
    for listID in list:
        print("listID: ", listID)
        response = get_storage_service(access_token,storage_url,listID)
        print("Response from storage: ", response.text)

    return "Success"

def get_jwt_token(consumer_key, consumer_secret, url):
    data = 'grant_type=client_credentials&client_id=' + consumer_key + '&client_secret=' + consumer_secret
    header = {"Content-type": "application/x-www-form-urlencoded"}
    try:
        response = requests.post(url, data=data, headers=header)
        access_token = json.loads(response.text)
        final_response=access_token['access_token']

    except requests.exceptions as err:
        print(err)
        final_response = 'error'
    return final_response


def get_storage_service(jwt_token, url, list_id):
    final_url = url + list_id + "/data"
    print("Final url is :", final_url)
    headers_api = {
        'Authorization': 'Bearer ' + jwt_token

    }
    try:
        response = requests.get(url=final_url, headers=headers_api)
    except requests.exceptions as err:
        print(err)
        response = 'error'
    return response