在python中发送GET请求的有效负载

时间:2016-08-09 09:44:46

标签: python python-2.7 get python-requests

要过滤输出,我可以向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请求发送有效载荷(上面讨论的方法)的问题仍然存在。

1 个答案:

答案 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)