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 的所有帮助!
因此,当我使用下面的 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 的所有帮助!