HTTP请求在cURL中工作但在urllib2.request中没有?

时间:2015-12-24 07:38:45

标签: python curl

我有这个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不正确。

这里可能有什么问题?

3 个答案:

答案 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. 这使用带有空数据的POST方法来模仿cURL命令 这也是一样。
  2. 标准OAuth 2.0使用POST来处理请求 令牌端点(这似乎是这个请求的内容),所以你的 Python代码是正确的

答案 1 :(得分:0)

可能是服务器不允许跨服务呼叫。您应该允许api服务器上的跨服务呼叫。

https://pypi.python.org/pypi/Flask-Cors/

答案 2 :(得分:0)

在curl请求中,数据作为查询参数传递给服务器。因此,而不是有效负载,将数据插入查询参数。它将是:

request_url = request_url + '?' + data

从构造函数data

中删除urllib2.Request(...)