web-dev-qa-db-ja.com

リクエストモジュールを使用してPython HTTPSリクエストを作成する正しい方法は?

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)

contenttextまたはresponseを返そうとすると、空の文字列が返されます。ただし、実際のresponseオブジェクトを出力すると、それは<Response [200]>しかし、これが実際に200 OKだった場合、私がPOSTしているサーバーも、指定したredirect_uriに移動する必要があり、そこで通知を受け取ります。

これは起こっていません、そして私はその理由について不思議に思っています。

5
digerati32

あなたのコードは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)

それがうまくいかない場合は、ペイロードデータが悪いと思われます。

12
Lukasa

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

4
flyer