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


91

在将JSON API调用集成到Python程序中寻求帮助。

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

API指南指出,必须生成一个承载令牌才能允许对API的调用,而我已经成功完成了该调用。但是,我不确定在Python API请求中将此令牌作为承载令牌认证包括在内的语法。

我可以使用带有标记的cURL成功完成上述请求。我已经尝试过“ urllib”和“ requests”路由,但是都没有用。

完整的API详细信息:IBM X-Force Exchange API文档-IP信誉

Answers:


142

这只是意味着它期望作为标题数据中的键

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

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

上面引发了以下语法错误: Traceback (most recent call last): File "bearerreturn.py", line 6, in <module> print requests.post(endpoint,data=data,headers=headers).json() TypeError: 'dict' object is not callable 下面的代码:有import requests endpoint = "https://xforce-api.mybluemix.net:443/api/ip" data = {"ip":"1.1.2.3"} headers = {"Bearer token":"TOKEN WAS INSERTED HERE"} print requests.post(endpoint,data=data,headers=headers).json() 任何想法吗?
user4657

您有旧版本的请求...json是您版本中的命令而不是函数requests.post(...).json ...不要称之为
Joran Beasley 2015年

感谢Joran Beasley。通过pip更新了请求库,这使我可以保留原始语法。但是,现在当我运行上面的命令时,它会输出以下.json响应: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} 这就像我直接在浏览器中单击URL一样。我是否缺少令牌或配置端点的方式?码:import requests endpoint = "https://xforce-api.mybluemix.net:443/ipr/" data = {"ip":"1.1.2.3"} headers = {"Bearer token":"TOKEN_HERE"} print requests.post(endpoint,data=data,headers=headers).json()
user4657

不幸的是,我无法真正解决这个问题……这是端点错误或您的凭据无效(您是否使用他们的示例令牌,仅为他们的url配置?),或者您需要将应用程序url放入他们的deleoper中您的代码面板...可能是您的第一个令牌...您需要将令牌交换为刷新令牌,然后可以使用该令牌来获得更永久的令牌(至少就是oauth2通常如何工作..)
Joran Beasley

糟糕,我的标头错误,请尝试更新代码
Joran Beasley

50

如果使用requests模块,则替代方法是编写auth类,如“新的身份验证形式”中所述:

import requests

class BearerAuth(requests.auth.AuthBase):
    def __init__(self, token):
        self.token = token
    def __call__(self, r):
        r.headers["authorization"] = "Bearer " + self.token
        return r

然后可以发送这样的请求

response = requests.get('https://www.example.com/', auth=BearerAuth('3pVzwec1Gs1m'))

这使您可以auth像使用基本auth一样使用相同的参数,并且可能在某些情况下为您提供帮助。


这对于zeep也可能有用。它使用授权的requests.auth类型(用于HTTP标头auth,而不是soap标头)
smido

20

必须根据以下格式将令牌放置在Authorization标头中:

授权:承载[Token_Value]

代码如下:

import urllib2
import json

def get_auth_token()
    '''
    get an auth token
    '''
     req=urllib2.Request("https://xforce-api.mybluemix.net/auth/anonymousToken")
     response=urllib2.urlopen(req)
     html=response.read()
     json_obj=json.loads(html)
     token_string=json_obj["token"].encode("ascii","ignore")
     return token_string

def get_response_json_object(url, auth_token)
    '''
      returns json object with info
    '''
    auth_token=get_auth_token()
    req=urllib2.Request(url, None, {"Authorization": "Bearer %s" %auth_token})
    response=urllib2.urlopen(req)
    html=response.read()
    json_obj=json.loads(html)
    return json_obj

对于Python3:req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
SidJ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.