使用请求模块制作Python HTTPS请求的正确方法?

dig*_*i32 5 python https python-requests

我必须在Python中发出HTTPS请求,并且我正在使用请求模块来尝试让我的生活更轻松.

请求需要有一个标头和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)
Run Code Online (Sandbox Code Playgroud)

当我尝试返回contenttextresponse,我得到一个空字符串.但是,当我打印实际response对象时,它表示它是a <Response [200]>,但如果这实际上是200 OK,那么我发布的服务器也应该转到我指定的redirect_uri,我会在那里收到通知.

这种情况没有发生,我为什么感到困惑.

Luk*_*asa 12

你的代码正在与Requests库作斗争:你自己做了很多东西,Requests会为你做.

首先,不要自己对数据进行表单编码,让Requests通过提供字典来实现data,比如@ flyer的回答建议.

执行此操作时,请求也将正确设置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)
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,那么我怀疑你的有效载荷数据是坏的.

  • 此外,OP可能认为Host标头保留在重定向中,而不是保留。 (2认同)

fly*_*yer 6

好像有两个错误。

第一个:
当你要发布数据时,数据格式应该是这样的:

payload = {
    'grant_type': 'authorization_code', 
    'code': request.args['code'],
    'state': request.args['state'],
    'redirect_uri': 'http://xxx.xyz.com/request_listener',
}
Run Code Online (Sandbox Code Playgroud)

第二个:
Requests可以自动验证 https 请求的 SSL 证书并将其设置verify=True为默认值。您设置verify=False,这意味着您要忽略 ssl 验证。那可能不是你想要的。这是文档