2013-12-10 95 views
3

我不得不做出了一个Python HTTPS请求,我现在用的请求模块,试图让我的生活更轻松。使用请求模块创建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) 

当我尝试返回responsecontenttext,我得到一个空字符串。然而,当我打印的实际response对象,它说,这是一个<Response [200]>,但如果这实际上是一个200 OK,然后我张贴过的服务器应该去我指定的REDIRECT_URI,我会得到一个通知那里。

这没有发生,我对此感到困惑。

+0

http://docs.python.org/3/library/urllib.request.html#module-urllib.request –

+0

有些事情可以尝试:使用'curl'手动构建请求,以确保您知道有效请求的内容应该是什么。如果这有效,那么你知道在Python中构建或传递请求的方式存在问题。将“有效载荷”构建为字典而不是字符串。尝试构建准备好的请求,以便在将请求发送到服务器之前检查请求状态。 –

回答

5

你的代码与Requests库相冲突:你自己在做很多东西,请求会为你做。首先,不要自己对数据进行表单编码,让请求通过提供一个字典到data来完成,就像@ flyer的回答建议的一样。

当您这样做时,请求也将正确设置Content-Type标题,因此您不必这样做。此外,请不要发送Connection标题:请求将为您管理它。这同样适用于Host标题:发送Host头只可能会导致问题。

最后,不要自己设置授权标头,让请求通过提供认证凭证来完成。该惯用的请求代码将是:

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

此外,OP可能认为Host头部在重定向时保留,而不是。 –

+0

我不得不在标头中包含base64中的客户端ID,所以我无法删除它,但我删除了其他所有内容。我确实将有效载荷数据更改为字典,但即使请求失败,我仍收到200 OK。我怀疑这个问题不是在那种情况下的请求。 – digerati32

+0

你怎么知道请求失败? – Lukasa

3

看来,有两个错误。

第一招:
当你想要发布的数据,数据的格式应该是这样的:

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

+0

服务器证书有一个签名问题,所以这就是为什么'verify'设置为False。将有效负载更改为字典会导致400错误:它表示请求在语法上不正确。 – digerati32

+0

@ digerati32,你可以给你想要请求的完整url吗? – flyer