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)
当我尝试返回content或text的response,我得到一个空字符串.但是,当我打印实际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)
如果这不起作用,那么我怀疑你的有效载荷数据是坏的.
好像有两个错误。
第一个:
当你要发布数据时,数据格式应该是这样的:
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 验证。那可能不是你想要的。这是文档
| 归档时间: | 
 | 
| 查看次数: | 37196 次 | 
| 最近记录: |