【问题标题】:Python Requests library undesirable GET request colon escapePython Requests 库不需要的 GET 请求冒号转义
【发布时间】:2019-12-13 09:14:03
【问题描述】:

我有一个带有 date_start 和 date_end 查询字符串参数的 RESTful API。 API 文档指出请求应具有一种 ISO 字符串中的日期时间,例如:2019-06-15T00:22:55。设置日期范围如下所示:

https://path/to/api?start_date=2019-06-15T00:22:55&end_date=2019-08-05T19:55:33

但是,Python 请求通过想要转义冒号 (:) 来破坏它,将它们替换为 %3A,从而导致

https://path/to/api?start_date=2019-06-15T00%3A22%3A55&end_date=2019-08-05T19%3A55%3A33

遗憾的是,API 不将其视为可溶参数。

当我从 Postman 运行 URL 时,该格式不会被破坏。但是,尝试使用通常令人惊叹的 Requests 库将我的应用程序连接到 API 时,它会进行字符串转义转换。根据请求文档的建议,我在 payload 样式的键值对中传递参数,如下所示:

info_id = 'abcXYZ1234'
url = 'path/to/sandbox'
start = '2019-06-15T00:00:00'
end = '2019-07-15T00:00:00'
payload = {'info_id': info_id, 'start_date': start, 'end_date': end}
r = requests.get(url, params=payload)
info = r.json()

如何防止请求转义冒号?

【问题讨论】:

  • 您是否尝试在 url - requests.get('https://path/to/api?start_date=2019-06-15T00:22:55&end_date=2019-08-05T19:55:33) 中直接使用此值?
  • 好问题 - 不,我在参数键值对中使用它。我会更新的。
  • 当您将字符串或字节分配给参数时, 也应该有效 - 如@Saritus 答案中所示。

标签: python get python-requests


【解决方案1】:

您可以使用requests.getparams 参数来防止对url 进行编码

url = 'https://path/to/api'
r = requests.get(url, params='start_date=2019-06-15T00:22:55&end_date=2019-08-05T19:55:33')

从典型的有效载荷字典结构转换非常容易(代码来自https://stackoverflow.com/a/23497912/10833207

payload = {
  'start_date': '2019-06-15T00:22:55',
  'end_date': '2019-08-05T19:55:33'
}

payload_str = "&".join("%s=%s" % (k,v) for k,v in payload.items())

r = requests.get(url, params=payload_str)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多