requests.post 和这个直卷曲有什么区别?
what's the difference between requests.post and this straight curl?
将 python 3.6.2 与 requests
库一起使用。
我正在尝试在 battle.net API 上使用 oauth2 进行身份验证,在第二次请求(用于令牌检索的请求)中,我收到了 400 错误,没有任何有用的解释("internal server error" ).
battle.net 论坛上有人建议尝试对 curl
执行相同的 POST
,并且有效。 (这是我的论坛 post:https://us.battle.net/forums/en/bnet/topic/20762236765)
我检查了很多次两者之间的一些愚蠢的区别(可能是错字),但没有(我也通过复制粘贴从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 专家。 headers 中可能有什么东西?如何将请求设置为具有相同的行为?
您不需要手动编码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>'
要调试此类问题,您可以post到https://httpbin.org/post
;响应将准确显示 POST 请求中发送的数据。
将 python 3.6.2 与 requests
库一起使用。
我正在尝试在 battle.net API 上使用 oauth2 进行身份验证,在第二次请求(用于令牌检索的请求)中,我收到了 400 错误,没有任何有用的解释("internal server error" ).
battle.net 论坛上有人建议尝试对 curl
执行相同的 POST
,并且有效。 (这是我的论坛 post:https://us.battle.net/forums/en/bnet/topic/20762236765)
我检查了很多次两者之间的一些愚蠢的区别(可能是错字),但没有(我也通过复制粘贴从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 专家。 headers 中可能有什么东西?如何将请求设置为具有相同的行为?
您不需要手动编码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>'
要调试此类问题,您可以post到https://httpbin.org/post
;响应将准确显示 POST 请求中发送的数据。