request.post和直接卷曲之间的区别是什么?

时间:2018-04-04 20:20:11

标签: python http python-requests battlenet-api

将python 3.6.2与requests库一起使用。

我试图在battle.net API上使用oauth2进行身份验证,并在第二个请求(用于令牌检索的请求)上进行身份验证我收到了400错误而没有任何有用的解释("内部服务器错误")。 在battle.net论坛上的某个人建议尝试使用POST执行相同的curl,并且它有效。 (这是我的论坛帖子:https://us.battle.net/forums/en/bnet/topic/20762236765

我多次检查两者之间的一些愚蠢差异(可能是一个错字),但是没有(我还通过copypasting从curl写回请求,获得相同的错误)。所以我想两者之间的行为应该存在一些实际差异。

这是python代码:

data = {
         'code': code,
         'redirect_uri': 'https%3A%2F%2Flocalhost%2Foauth2callback',
         'grant_type': 'authorization_code',
         'client_id': CLIENT_ID,
         'client_secret': CLIENT_SECRET,
         'scope': 'sc2.profile'
    }
resp = requests.post('https://eu.battle.net/oauth/token', data=data)

这是卷曲:

curl -X POST -s "https://eu.battle.net/oauth/token" \
    -d client_id='<same as above>' \
    -d client_secret='<same as above>'  \
    -d grant_type='authorization_code' \
    -d redirect_uri='https%3A%2F%2Flocalhost%2Foauth2callback' \
    -d scope='sc2.profile'  \
    -d code='<same as above>'

正如我所说,我想应该有不同的东西,但我不是http的专家。标题中的东西可能吗?如何设置具有相同行为的请求?

1 个答案:

答案 0 :(得分:3)

您无需手动编码redirect_uri; requests会为你做到这一点。

data = {
     'code': code,
     'redirect_uri': 'https://localhost/oauth2callback',
     'grant_type': 'authorization_code',
     'client_id': CLIENT_ID,
     'client_secret': CLIENT_SECRET,
     'scope': 'sc2.profile'
}
resp = requests.post('https://eu.battle.net/oauth/token', data=data)

等效curl来电将使用--data-urlencode而不是-d / --data

curl -X POST -s "https://eu.battle.net/oauth/token" \
    -d client_id='<same as above>' \
    -d client_secret='<same as above>'  \
    -d grant_type='authorization_code' \
    --data-urlencode redirect_uri='https://localhost/Foauth2callback' \
    -d scope='sc2.profile'  \
    -d code='<same as above>'

要调试此类问题,您可以发布到https://httpbin.org/post;响应将准确显示POST请求中发送的数据。