使用请求模块发出Python HTTPS请求的正确方法



我必须用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)

当我试图返回responsecontenttext时,我得到一个空字符串。然而,当我打印实际的response对象时,它说它是一个<Response [200]>,但如果这实际上是一个200 OK,那么我正在POST的服务器也应该转到我指定的redirect_uri,我会在那里收到通知。

这并没有发生,我很困惑为什么。

您的代码正在与请求库作斗争:您自己正在做很多请求将为您做的事情。

首先,不要自己对数据进行形式编码,让Request通过向data提供字典来完成,就像@flyer的答案所建议的那样。

当你这样做时,请求也会正确设置内容类型标头,所以你不必这样做。此外,请不要发送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)

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

似乎有两个错误。

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

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验证。这也许不是你想要的。这是文档

相关内容

最新更新