使用请求模块发出Python HTTPS请求的正确方法?
我必须用Python发出一个HTTPS请求,我正在使用请求模块来让我的生活更轻松 请求需要有一个标题和3个表单参数URL编码。这就是我正在做的:使用请求模块发出Python HTTPS请求的正确方法?,python,https,python-requests,Python,Https,Python Requests,我必须用Python发出一个HTTPS请求,我正在使用请求模块来让我的生活更轻松 请求需要有一个标题和3个表单参数URL编码。这就是我正在做的: header = {'Content-type': 'application/x-www-form-urlencoded', 'Authorization':'Basic ' + encoded_string, 'Connection': 'Keep-Alive', 'Host':'host.host.com'} payload='grant_typ
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)
当我试图返回响应
的内容
或文本
时,我得到一个空字符串。但是,当我打印实际的响应
对象时,它会说它是一个
,但是如果这实际上是一个200 OK,那么我发布的服务器也应该转到我指定的重定向uri,我会在那里收到通知
这并没有发生,我很困惑为什么。似乎有两个错误 第一个:
要发布数据时,数据格式应如下所示:
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验证。那可能不是你想要的。以下是您的代码与请求库发生冲突的原因:您自己正在做许多请求可以为您做的事情
首先,不要自己对数据进行表单编码,让请求通过提供数据
字典来完成,就像@flyer的答案所建议的那样
执行此操作时,请求还将正确设置内容类型标头,因此您不必这样做。另外,请不要发送连接
标题:请求将为您管理它。这同样适用于主机
头:发送主机
头只会导致问题
最后,不要自己设置授权头,让请求通过提供身份验证凭据来完成。惯用的请求代码是:
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)
如果这不起作用,那么我会怀疑您的有效负载数据是错误的。一些尝试:使用
curl
手动构造请求,以确保您知道有效请求的内容应该是什么。如果这样做有效,那么您就知道在Python中构建或交付请求的方式存在问题。将有效负载
构造为dict而不是字符串。请尝试生成准备好的请求,以便在将请求发送到服务器之前检查请求状态。服务器证书存在签名问题,因此verify
设置为False。将有效负载更改为dict会导致400错误:其中表示请求的语法不正确。@digerati32,您能给出您想要请求的完整url吗?此外,OP可能认为主机头在重定向时被保留,而不是。我必须在头中包含base64中的客户端id,因此无法删除它,但我把其他的都拿走了。我确实将有效负载数据更改为dict,但即使请求失败,我也会收到200 OK。我怀疑问题不在请求上。你怎么知道请求失败了?