我在 AWS Lambda 函式中呼叫具有基本身份驗證的 REST API。這是我的代碼
import json, os, base64
from urllib import request
def lambda_handler(event, context):
retStatusCode = 0
retBody = ""
try:
url = os.environ['URL']
username = os.environ['USERNAME']
password = os.environ['PASSWORD']
requestURL = url "/" event['queueID'] "/" event['cli'];
#print ("QUEUEID IS: " event['queueID'])
#print ("CLI IS: " event['cli'])
#print ("URL IS: " requestURL)
req = request.Request(requestURL, method="POST")
myStr = '%s:%s' % (username, password)
myBytes = myStr.encode("utf-8")
base64string = base64.b64encode(myBytes)
req.add_header("Authorization", "Basic %s" % base64string)
resp = request.urlopen(req)
responseJSON = json.load(resp)
retStatusCode = responseJSON["Result"]
retBody = responseJSON["Message"]
except Exception as e:
retStatusCode = 500
retBody = "An exception occurred: " str(e)
return {
'statusCode': retStatusCode,
'body': retBody
}
但是,我收到“HTTP 錯誤 401:未經授權”回傳。如果我使用相同的憑據呼叫 Postman 中的 API 方法,它會成功回傳資料,所以我認為這一定與我添加的標頭的格式有關,但看不出有什么問題。
uj5u.com熱心網友回復:
問題出在這一行:
req.add_header("Authorization", "Basic %s" % base64string)
從檔案中,base64.b64encode方法旨在“回傳編碼位元組”。
如果您嘗試在 REPL 中執行此代碼,您會發現生成的標頭看起來是錯誤的。它將字串與位元組連接起來:
>>> "Basic %s" % base64string
"Basic b'aGVsbG86d29ybGQ='"
您可以在此處閱讀有關 Pythonb'語法的更多資訊。
因此,您需要將字串解碼回 utf8。
req.add_header("Authorization", "Basic %s" % base64string.decode('utf-8'))
結果現在看起來像一個有效的 Auth 標頭:
>>> "Basic %s" % base64string.decode('utf-8')
'Basic aGVsbG86d29ybGQ='
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/515234.html
標籤:Python亚马逊网络服务api休息aws-lambda
