PythonでHTTPSリクエストを作成する必要があり、requestsモジュールを使用して自分の生活を楽にしようとしています。
リクエストには、ヘッダーと3つのFORMパラメーターのURLエンコードが必要です。これは私がしていることです:
header = {'Content-type': 'application/x-www-form-urlencoded', 'Authorization':'Basic ' + encoded_string, 'Connection': 'Keep-Alive', 'Host':'Host.host.com'}
payload='grant_type=authorization_code&code=' + request.args['code'] + '&state=' + request.args['state'] + '&redirect_uri=http://xxx.xyz.com/request_listener'
url = 'https://serviceprovider.xxx.com/auth/j_oauth_resolve_access_code'
response = requests.post(url, data=payload, headers=header, verify=False)
content
のtext
またはresponse
を返そうとすると、空の文字列が返されます。ただし、実際のresponse
オブジェクトを出力すると、それは<Response [200]>
しかし、これが実際に200 OKだった場合、私がPOSTしているサーバーも、指定したredirect_uriに移動する必要があり、そこで通知を受け取ります。
これは起こっていません、そして私はその理由について不思議に思っています。
あなたのコードはRequestsライブラリと戦っています:あなたはRequestsがあなたのために行うであろう多くのことをあなた自身でやっています。
まず、データを自分でフォームエンコードしないでください。@ flyerの回答が示唆するように、data
に辞書を提供してRequestsにエンコードさせてください。
これを行うと、RequestsはContent-Typeヘッダーも正しく設定するため、その必要はありません。また、Connection
ヘッダーを送信しないでください。リクエストによって管理されます。同じことがHost
ヘッダーにも当てはまります。Host
ヘッダーを送信すると問題が発生するだけです。
最後に、Authorizationヘッダーを自分で設定するのではなく、認証資格情報を提供してRequestsに設定させます。慣用的なリクエストコードは次のようになります。
payload = {
'grant_type': 'authorization_code',
'code': request.args['code'],
'state': request.args['state'],
'redirect_uri': 'http://xxx.xyz.com/request_listener',
}
url = 'https://serviceprovider.xxx.com/auth/j_oauth_resolve_access_code'
response = requests.post(url, data=payload, verify=False)
それがうまくいかない場合は、ペイロードデータが悪いと思われます。
2つの間違いがあるようです。
最初の1つ:
データを投稿する場合、データ形式は次のようになります。
payload = {
'grant_type': 'authorization_code',
'code': request.args['code'],
'state': request.args['state'],
'redirect_uri': 'http://xxx.xyz.com/request_listener',
}
二番目:Requests
はhttpsリクエストのSSL証明書を自動的に検証でき、verify=True
をデフォルトとして設定します。 verify=False
を設定します。これは、SSL検証を無視することを意味します。それはおそらくあなたが望むものではありません。これが doc