我必须在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
的{{1}}或text
时,我得到一个空字符串。但是,当我打印实际的response
对象时,它表示它是response
,但如果这实际上是200 OK,那么我发布的服务器也应该转到我指定的redirect_uri而且我会在那里收到通知。
这种情况并没有发生,我为何会感到困惑。
答案 0 :(得分:8)
您的代码正在与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)
如果这不起作用,那么我怀疑你的有效载荷数据是坏的。
答案 1 :(得分:4)
似乎有两个错误。
第一个:
如果要发布数据,数据格式应如下所示:
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验证。那可能不是你想要的。这是doc