使用请求模块制作Python HTTPS请求的正确方法?

时间:2013-12-10 03:58:04

标签: 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的{​​{1}}或text时,我得到一个空字符串。但是,当我打印实际的response对象时,它表示它是response,但如果这实际上是200 OK,那么我发布的服务器也应该转到我指定的redirect_uri而且我会在那里收到通知。

这种情况并没有发生,我为何会感到困惑。

2 个答案:

答案 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