要过滤输出,我可以向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编码的。所以我尝试将我的网址格式化为这样的格式并避免发送有效负载,例如:
r = requests.get(url, headers=my_headers)
它有效!所以至少现在我有一个解决我的问题的方法。但是关于如何为GET请求发送有效载荷(上面讨论的方法)的问题仍然存在。
答案 0 :(得分:1)
当您使用-d
时,数据将作为请求正文发送。 params
发送一个URL查询字符串,因此这是一个错误的参数。
请注意,使用GET
方法在请求正文中打包在技术上违反了HTTP RFC。
您必须将data
参数设置发送给您的请求,或者将字典传递给json
关键字参数,requests
将对其进行编码并设置正确Content-Type
1}}标题为你:
my_headers = {
'Authorization': 'XXXXX',
}
data = {
"q": {
"name": {
"eq": "0aslam0"
}
}
}
r = requests.get(url, headers=my_headers, json=data)