尝试通过函数参数将正文发送到 API 时出现 KeyError
KeyError when trying to send body to API via function parameter
试图通过 python 函数向 API 发送 POST 请求,但我无法遍历字符串列表并将字符串传递给函数。
已在 Postman 中成功测试(请求以 "raw Body" 的形式向 API 发送字符串,如 Postman 所示)。将代码从 Postman 复制到 Python,并验证它也有效。问题是,如果我将静态字符串更改为函数的参数,我会得到一个 KeyError,但是如果我只是将参数(它是一个值,而不是一个键)替换为一个字符串,那么 keyerror 就会消失。
这有效...
payload = "{\"ids\":[\"cb5f9a97c0e749ab67409e78b4fcb11d\"]}" works
但是 none 这些工作(注意右边的错误代码);特别是前两个和上面一模一样的...
payload = "{\"ids\":[\"{0}\"]}".format(id) #gives KeyError: '"ids"'
payload = "{\"ids\":[{0}]}".format(id) #gives KeyError: '"ids"'
payload = "{'ids':'[{0}]'}".format(id) #gives KeyError: "'ids'"
payload = "{ids:[\"{0}\"]}".format(id) #gives KeyError: 'ids'
我还尝试修改 key/value 对中的密钥 ('ids'),这导致了 NameErrors。由于这偏离了上面已知的工作示例,我认为下面的尝试不值得继续尝试...
payload = {ids:"[{0}]".format(id)} #gives NameError: name 'ids' is not defined
payload = {ids:"{0}".format(id)} #gives NameError: name 'ids' is not defined
payload = {ids:id} #gives NameError: name 'ids' is not defined
我什至验证了从列表中生成的字符串实际上是一个字符串。
完整(相关)代码如下:
def cs_delete(id):
print(id)
url = "https://api.crowdstrike.com/devices/entities/devices-actions/v2"
querystring = {"action_name":"hide_host"}
payload = "{'ids':['{0}']}".format(id)
headers = {
'Content-Type': "application/json",
'Authorization': "Bearer " + cs_auth,
'Accept': "*/*",
'Cache-Control': "no-cache",
'Host': "api.crowdstrike.com",
'Accept-Encoding': "gzip, deflate",
'Content-Length': "83",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
response = requests.request("POST", url, data=payload, headers=headers, params=querystring)
print(response.text)
for host in dfList:
print(host)
cs_delete(host)
为了完整起见,dfList 显示为:
['2a9cf64988e6464f7d2ba7f305a612f3', '5ba4654e1dbe418f7b6361582e3d8f47', '7c6fc20572c241f664813f48bb36c340', 'ccbaf1ebe52042fc6b8269bf86732676']
将外部大括号加倍以对其进行转义,或者 format()
将期望输入值应用于外部大括号而不是 {0}
>>> id = 'cb5f9a97c0e749ab67409e78b4fcb11d'
>>> "{{'ids':[{0}]}}".format(id)
"{'ids':[cb5f9a97c0e749ab67409e78b4fcb11d]}"
试图通过 python 函数向 API 发送 POST 请求,但我无法遍历字符串列表并将字符串传递给函数。
已在 Postman 中成功测试(请求以 "raw Body" 的形式向 API 发送字符串,如 Postman 所示)。将代码从 Postman 复制到 Python,并验证它也有效。问题是,如果我将静态字符串更改为函数的参数,我会得到一个 KeyError,但是如果我只是将参数(它是一个值,而不是一个键)替换为一个字符串,那么 keyerror 就会消失。
这有效...
payload = "{\"ids\":[\"cb5f9a97c0e749ab67409e78b4fcb11d\"]}" works
但是 none 这些工作(注意右边的错误代码);特别是前两个和上面一模一样的...
payload = "{\"ids\":[\"{0}\"]}".format(id) #gives KeyError: '"ids"'
payload = "{\"ids\":[{0}]}".format(id) #gives KeyError: '"ids"'
payload = "{'ids':'[{0}]'}".format(id) #gives KeyError: "'ids'"
payload = "{ids:[\"{0}\"]}".format(id) #gives KeyError: 'ids'
我还尝试修改 key/value 对中的密钥 ('ids'),这导致了 NameErrors。由于这偏离了上面已知的工作示例,我认为下面的尝试不值得继续尝试...
payload = {ids:"[{0}]".format(id)} #gives NameError: name 'ids' is not defined
payload = {ids:"{0}".format(id)} #gives NameError: name 'ids' is not defined
payload = {ids:id} #gives NameError: name 'ids' is not defined
我什至验证了从列表中生成的字符串实际上是一个字符串。
完整(相关)代码如下:
def cs_delete(id):
print(id)
url = "https://api.crowdstrike.com/devices/entities/devices-actions/v2"
querystring = {"action_name":"hide_host"}
payload = "{'ids':['{0}']}".format(id)
headers = {
'Content-Type': "application/json",
'Authorization': "Bearer " + cs_auth,
'Accept': "*/*",
'Cache-Control': "no-cache",
'Host': "api.crowdstrike.com",
'Accept-Encoding': "gzip, deflate",
'Content-Length': "83",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
response = requests.request("POST", url, data=payload, headers=headers, params=querystring)
print(response.text)
for host in dfList:
print(host)
cs_delete(host)
为了完整起见,dfList 显示为:
['2a9cf64988e6464f7d2ba7f305a612f3', '5ba4654e1dbe418f7b6361582e3d8f47', '7c6fc20572c241f664813f48bb36c340', 'ccbaf1ebe52042fc6b8269bf86732676']
将外部大括号加倍以对其进行转义,或者 format()
将期望输入值应用于外部大括号而不是 {0}
>>> id = 'cb5f9a97c0e749ab67409e78b4fcb11d'
>>> "{{'ids':[{0}]}}".format(id)
"{'ids':[cb5f9a97c0e749ab67409e78b4fcb11d]}"