【问题标题】:Sending payload for GET request in python在 python 中发送 GET 请求的有效负载
【发布时间】: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


【解决方案1】:

当您使用-d 时,数据将作为请求正文 发送。 params 发送一个 URL 查询字符串,所以使用的参数是错误的。

请注意,使用 GET 方法打包请求正文在技术上违反了 HTTP RFC。

您必须将您的请求发送到 data 参数集,或者将您的字典传递给 json 关键字参数,requests 将对其进行编码并为您设置正确的 Content-Type 标头:

my_headers = {
    'Authorization': 'XXXXX',
}
data = { 
    "q": {
        "name": {
            "eq": "0aslam0"
        }
    }
}
r = requests.get(url, headers=my_headers, json=data)

【讨论】:

  • @0aslam0:生成的 HTTP 请求与您的 curl 命令生成的相同。唯一的区别是 User-Agent: curl/7.43.0 标头,真的。
猜你喜欢
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多