API 当 "params" 被编码到 get 请求中时,查询不会 return 结果,但当 URL 未被编码时, API 调用有效

API Query Doesn't return results when "params" is encoded into a get request but API call works when URL isn't encoded

因此,当我使用下面的 URL 通过 Postman 访问 API 目标时,它工作正常,没有任何问题

base_url = https://api.cats.net/orgs/CatEmpire/audit-log?phrase=action:stuck_on_tree+date_of_event:2022-01-11

但是,当我将以下参数附加到我的请求中时,URL 出现不同,我无法再获得结果

parameters = {
    'action:': 'stuck_on_tree',
    'date_of_event:': '2022-01-11'
}

PAT = asdasdhdhdhhd123123

response = requests.get(base_url, headers={"Accept": "application/vnd.github.v3+json", "Authorization": f"Bearer {PAT}"}, params=parameters)

print(response.request.url)
#This returns https://api.cats.net/orgs/CatEmpire/audit-log?phrase=&action%3A=stuck_on_tree&date_of_event%3A=2022-01-11

我试过使用:

paramters_string = urllib.parse.urlencode(parameters, safe='')

然后我在下面更新了我的响应变量,但结果仍然完全相同。我试图进行一些挖掘,但我似乎无法弄清楚这是否是一个问题,因为我正在使用字典来传递参数,或者是否还有其他我无法理解的东西。我是 Python.

的新手
`response = requests.get(base_url, headers={"Accept": "application/vnd.github.v3+json", "Authorization": f"Bearer {PAT}"}, params=parameters)`

你试过了吗?

PAT = "asdasdhdhdhhd123123"

data = parameters 

这只是一个授权请求的例子:

import requests
endpoint = ".../api/ip"
data = {"ip": "1.1.2.3"}
headers = {"Authorization": "Bearer MYREALLYLONGTOKENIGOT"}
response = requests.post(endpoint, data=data, headers=headers)

您的基础 URL 不应包含您的查询字符串的一部分 (?phrase=)。

将此用作您的基地 URL:

https://api.cats.net/orgs/CatEmpire/audit-log

对于你的参数,使用这个:

parameters = {
    'phrase': 'action:stuck_on_tree+date_of_event:2022-01-11'
}

更新

由于 API 约束,您无法 URL 对参数进行编码,因此您必须像这样将它们作为字符串传递:

parameters = 'phrase=action:stuck_on_tree+date_of_event:2022-01-11'

所以我想通了。我需要为每个参数创建一个单独的键,如下所示:

params = { 
   'phrase': 'action:stuck_on_tree',
   'date_of_event:': '2022-01-11'
}

我不确定为什么我不能将所有内容都放入 'phrase' 键中,但这行得通并且也是我开始尝试做的,因为我希望能够传递东西动态地进入 params 字典,所以将我的所有参数都放在一个键中将是一个问题。我不需要编码或取消编码任何东西。基本上分号是我的问题哈哈。感谢您对@dimz 和@john glenn 的所有帮助!