Thực hiện cuộc gọi API bằng Python với một API yêu cầu mã thông báo mang


92

Đang tìm kiếm một số trợ giúp về việc tích hợp lệnh gọi API JSON vào chương trình Python.

Tôi đang tìm cách tích hợp API sau vào một chương trình Python .py để cho phép nó được gọi và phản hồi được in.

Hướng dẫn API nêu rõ rằng phải tạo mã thông báo mang tên để cho phép các lệnh gọi tới API mà tôi đã thực hiện thành công. Tuy nhiên, tôi không chắc về cú pháp để bao gồm mã thông báo này làm xác thực mã thông báo không mang trong yêu cầu API Python.

Tôi có thể hoàn thành thành công yêu cầu trên bằng cURL có kèm theo mã thông báo. Tôi đã thử các tuyến đường "urllib" và "yêu cầu" nhưng không có kết quả.

Chi tiết đầy đủ về API: Tài liệu API X-Force Exchange của IBM - Danh tiếng IP

Câu trả lời:


143

Nó chỉ có nghĩa là nó mong đợi điều đó như một chìa khóa trong dữ liệu tiêu đề của bạn

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

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

Ở trên ném ra lỗi cú pháp sau: 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 Mã Dưới đây: 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() Bất kỳ ý tưởng?
user4657,

bạn có một phiên bản cũ của yêu cầu ... jsonlà một dict trong phiên bản của bạn và không phải là một chức năng requests.post(...).json ... dont gọi nó
Joran Beasley

Cảm ơn Joran Beasley. Đã cập nhật thư viện Yêu cầu qua pip và điều này cho phép tôi giữ nguyên cú pháp ban đầu. Tuy nhiên, bây giờ khi tôi chạy phần trên, nó xuất ra phản hồi .json này: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} Điều này giống như khi tôi nhấn URL trực tiếp trong trình duyệt. Tôi có thiếu thứ gì đó với mã thông báo hoặc cách điểm cuối được định cấu hình không? Mã: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

Rất tiếc, tôi không thể thực sự giúp được điều đó ... đó là một điểm cuối kém hoặc thông tin đăng nhập của bạn không hợp lệ (bạn có đang sử dụng mã thông báo mẫu của họ không, chỉ được định cấu hình cho url của họ?) hoặc có lẽ bạn cần đặt url ứng dụng của mình vào trình xóa của họ bảng điều khiển cho mã của bạn ... rất có thể đó là mã thông báo đầu tiên của bạn ... bạn cần đổi mã thông báo lấy mã thông báo làm mới mà sau đó bạn có thể sử dụng để nhận mã thông báo lâu dài hơn (ít nhất đó là cách oauth2 thường hoạt động ..)
Joran Beasley

vẻ tả như tôi đã sai tiêu đề thử mã cập nhật
Joran Beasley

51

Nếu bạn đang sử dụng requestsmô-đun, một tùy chọn thay thế là viết lớp auth, như được thảo luận trong " Hình thức xác thực mới ":

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

và sau đó bạn có thể gửi những yêu cầu như thế này không

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

cho phép bạn sử dụng cùng một authđối số giống như xác thực cơ bản và có thể giúp bạn trong một số trường hợp nhất định.


Điều này cũng có thể hữu ích với zeep. Nó sử dụng loại ủy quyền
request.auth

20

Mã thông báo phải được đặt trong tiêu đề Ủy quyền theo định dạng sau:

Ủy quyền: Bearer [Token_Value]

Mã bên dưới:

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

Đối với Python3:req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
SidJ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.