KeyError при попытке отправить тело в API через параметр функции - PullRequest
0 голосов
/ 07 ноября 2019

Попытка отправить запрос POST к API через функцию python, и я не могу перебрать список строк и передать строки в функцию.

Успешно протестировал это в Postman (запрос отправляет строку в API в виде «сырого тела», как показано в «Почтальоне»). Скопировал код из Почтальона в Python и проверил, что тоже работает. Проблема состоит в том, что если я заменяю статическую строку на параметр функции, я получаю KeyError, однако, если я просто заменяю параметр (который является значением, а не ключом) на строку, тогда keyerror исчезает.

Это работает ...

payload = "{\"ids\":[\"cb5f9a97c0e749ab67409e78b4fcb11d\"]}" works

Но ничего из этого не работает (обратите внимание на код ошибки справа);особенно первые два, которые точно такие же, как указано выше ...

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'

Я также попытался изменить ключ ('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']

1 Ответ

1 голос
/ 07 ноября 2019

удвоить внешнюю фигурную скобку, чтобы избежать ее, или format() будет ожидать, что входное значение должно быть применено для внешней фигурной скобки, а не {0}

>>> id = 'cb5f9a97c0e749ab67409e78b4fcb11d'
>>> "{{'ids':[{0}]}}".format(id)
"{'ids':[cb5f9a97c0e749ab67409e78b4fcb11d]}"
...