私は、Pythonライブラリを要求を使用してAPI POSTリクエストを作成しようとしています。私は通過していAuthorization
ヘッダーが、私は、デバッグしようとしたとき、私は、ヘッダーが削除されていることを見ることができます。私は何が起こっているか見当がつかない。
ここに私のコードは次のとおりです。
def make_post_request():
access_token = get_access_token()
bearer_token = base64.b64encode(bytes("'Bearer {}'".format(access_token)), 'utf-8')
print bearer_token
headers = {'Content-Type': 'application/json', 'Authorization': bearer_token}
data = '{"FirstName" : "Jane", "LastName" : "Smith"}'
response = requests.post('https://myserver.com/endpoint', headers=headers, data=data)
print response.request.headers
print response.text
結果print response.request.headers
です。 {'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.4.3 CPython/2.7.9 Linux/4.1.19-v7+'}
Authorizationヘッダは、要求ヘッダーに存在しないと仮定驚くべきことではない - と要求「は無効なセッションIDを」というエラーメッセージと共に失敗します。
本当に私が気づいた混乱何かが、私はPOSTリクエストをGETリクエストであることを変更した場合、それは通過ヘッダを渡すということでした!
なぜこのライブラリは、POSTリクエストのヘッダを落とすことになるとどのように私は仕事にこれを得るのですか?
libのリクエストやPythonのv2.4.3を使用して2.7.9
リクエスト2.4.3では、唯一の場所reqeuests
削除Authorization
要求が別のホストにリダイレクトされるときにヘッダがあります。これは、関連するコードです:
if 'Authorization' in headers: # If we get redirected to a new host, we should strip out any # authentication headers. original_parsed = urlparse(response.request.url) redirect_parsed = urlparse(url) if (original_parsed.hostname != redirect_parsed.hostname): del headers['Authorization']
新しいバージョンではrequests
、Authorization
ヘッダは、(例えば、リダイレクトがセキュアから非セキュアプロトコルである場合)、追加の場合には削除されます。
おそらくあなたの場合に何が起こるか、あなたのポストの要求が別のホストにリダイレクトされますということです。あなたが認証を保持したい場合は、要求はあなただけ使用してそれを行うことを可能にするnetrc
ファイルを。残念ながらそれはあなたがあなたの認証方法ではないように思われるHTTP基本認証を使用できるようになります。その場合には、最善の解決策は、サブクラスに思われるrequests.Session
ので、同じように、この動作をオーバーライドします。
from requests import Session
class NoRebuildAuthSession(Session):
def rebuild_auth(self, prepared_request, response):
"""
No code here means requests will always preserve your authorization when redirected.
Be careful not to leak your credentials to untrusted hosts!
"""
session = NoRebuildAuthSession()
response = session.post('https://myserver.com/endpoint', headers=headers, data=data)