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

使用请求模块发出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

我必须用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_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。我怀疑问题不在请求上。你怎么知道请求失败了?