【发布时间】:2016-12-15 07:08:45
【问题描述】:
要过滤输出,我可以向 API 发送 JSON,例如:
curl -X GET https://api.mysite.com/user \
-H "Authorization: XXXXX" \
-H "Content-Type: application/json"
-d '{
"q": {
"name": {
"eq": "0aslam0"
}
}
}'
以上工作正常。我正在尝试使用 requests 库通过 python 代码发送相同的内容。我尝试了以下代码:
r = requests.get(url, headers=my_headers, params=payload)
在哪里
url = "https://api.mysite.com/user"
my_headers = {
'Authorization': 'XXXXX',
'Content-Type': 'application/json',
'Accept': 'application/json',
}
data = {
"q": {
"name": {
"eq": "0aslam0"
}
}
}
payload = json.dumps(data)
但r.text 包含正常 GET 的输出,但未应用过滤器。我记录了请求,发现我收到了重定向301。我不明白我的错误。
编辑 1
我把代码改成:
r = requests.get(url, headers=my_headers, json=payload)
@Martijn 是对的。使用 params 是错误的。但上述也没有成功。我还添加了一个标题'User-Agent': 'curl/7.40.0',看看这是否可行。那里也没有运气。
编辑 2
API 文档说,过滤可以通过另一种方法完成。将网址更改为:
GET /user?q%5Bname%5D%5Beq%5D=0aslam0 HTTP/1.1
它是 HTML 编码的。所以我尝试将我的 url 格式化为这种格式并避免发送有效负载,例如:
r = requests.get(url, headers=my_headers)
而且它有效!所以至少现在我有一个解决我的问题的方法。但是关于如何为 GET 请求发送有效载荷(上面讨论的方法)的问题仍然存在。
【问题讨论】:
-
Authorization header是怎么形成的?是否包含任何基于请求正文的签名?
-
授权标头是为 API 的任何开发者生成的令牌。不,没有任何东西,例如依赖于请求正文的签名。
-
那我几乎没有想法了;下面的答案产生的请求与您的
curl命令所做的很接近(这相当奇怪,因为它使用GET而不是POST)。 -
@MartijnPieters 在问题中添加了更多详细信息。我不认为你错了。
-
您从 curl 中看到的 URL 意味着您在 URL 中具有
"q[name][eq]=0aslam0"作为查询参数。curl将不会从您在此处显示的命令行设置那些;它已经是 URL 的一部分或您使用了--data-urlencode命令行选项。
标签: python python-2.7 get python-requests