我有这个cURL命令按预期运行:
curl -v -X POST -H "Api-Key:75b5cc58a5cdc0a583f91301cefedf0c" -H "Content-Type:application/x-www-form-urlencoded" "http://localhost:8080/app?client_id=ef5f7a03-58e8-48d7-a38a-abbd2696bdb6&grant_type=refresh_token&username=user1&password=password&refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
此命令返回JSON。
我尝试使用urllib2
来模拟此调用。
request_url = "http://localhost:8080/app"
values = {
"client_id": "ef5f7a03-58e8-48d7-a38a-abbd2696bdb6",
"grant_type": "refresh_token",
"username": "user1",
"password": "password"
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
}
data = urlencode(values)
req = urllib2.Request(request_url, data)
req.add_header("Api-Key", "75b5cc58a5cdc0a583f91301cefedf0c")
req.add_header("Content-Type", "application/x-www-form-urlencoded")
print request_url
print req.get_data()
print req.get_method()
print req.get_full_url()
这是我得到的输出:
http://localhost:8080/app
username=user1&password=password&grant_type=refresh_token&refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9&client_id=ef5f7a03-58e8-48d7-a38a-abbd2696bdb6
POST
http://localhost:8080/app
以上urllib2.request
返回错误代码401,这意味着我发送的refresh_token不正确。
这里可能有什么问题?
答案 0 :(得分:1)
cURL命令将值作为查询参数传递为URL的一部分。 urllib2命令将值作为POST数据传递。您应该使用:
request_url = "http://localhost:8080/app"
values = {
"client_id": "ef5f7a03-58e8-48d7-a38a-abbd2696bdb6",
"grant_type": "refresh_token",
"username": "user1",
"password": "password"
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
}
request_url = request_url + "?" + urlencode(values)
data = ""
req = urllib2.Request(request_url, data)
req.add_header("Api-Key", "75b5cc58a5cdc0a583f91301cefedf0c")
req.add_header("Content-Type", "application/x-www-form-urlencoded")
两个评论:
答案 1 :(得分:0)
可能是服务器不允许跨服务呼叫。您应该允许api服务器上的跨服务呼叫。
答案 2 :(得分:0)
在curl请求中,数据作为查询参数传递给服务器。因此,而不是有效负载,将数据插入查询参数。它将是:
request_url = request_url + '?' + data
从构造函数data
urllib2.Request(...)