Преобразование "curl -X PUT ... - G ..." в python с использованием модуля запросов - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь написать некоторый код на Python для взаимодействия с API New Relic. Я использую модуль запросов. По большей части я был успешным, но у меня проблемы с одним вызовом API. Их документация представляет вызов с помощью команды curl:

https://docs.newrelic.com/docs/alerts/rest-api-alerts/new-relic-alerts-rest-api/rest-api-calls-new-relic-alerts (в разделе «Обновление каналов уведомлений, связанных с политиками»)

curl -X PUT 'https://api.newrelic.com/v2/alerts_policy_channels.json' \
     -H 'X-Api-Key:{admin_api_key}' -i \
     -H 'Content-Type: application/json' \
     -G -d 'policy_id=policy_id&channel_ids=channel_id'

Моя главная проблема в том, что мне неясно, как перевести -G на python с помощью библиотеки ответов. Я даже не совсем уверен, что понимаю, что делает этот флаг, похоже, он делает дополнительный запрос get в дополнение к исходному PUT?

Я использовал этот конвертер, который работал с большинством вызовов curl, с которыми я работал, но не с этим.

https://curl.trillworks.com/

Это то, что генерируется на основе приведенной выше команды curl (которая не работает):

import requests

headers = {
    'X-Api-Key': '{admin_api_key}',
    'Content-Type': 'application/json',
}

data = {
  'policy_id': 'policy_id',
  'channel_ids': 'channel_id'
}

response = requests.put('https://api.newrelic.com/v2/alerts_policy_channels.json', headers=headers, data=data)

Это в основном тот же код, только в функции, где я на самом деле его использую:

def set_alert_policy_notification_channel(admin_api_key, policy_id, notification_channel_id):
    headers = {
        'X-Api-Key': admin_api_key,
        'Content-Type': 'application/json',
    }

    data = {
    'policy_id': policy_id,
    'channel_ids': notification_channel_id
    }

    response = requests.put('https://api.newrelic.com/v2/alerts_policy_channels.json', headers=headers, data=data)
    logging.debug(response)
    return response

Когда я звоню, я получаю 500 ошибок, возможно, потому что запрос сформирован неправильно:

2019-07-11 09: 35: 31,546 - ОТЛАДКА - Запуск нового HTTPS-соединения (1): api.newrelic.com:443 2019-07-11 09: 35: 32,046 - ОТЛАДКА - https://api.newrelic.com:443 "PUT /v2/alerts_policy_channels.json HTTP / 1.1" 500 Нет 2019-07-11 09: 35: 32,293 - ОТЛАДКА -

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

-G в curl превращает все, что вы передаете как -d / --data (и тому подобное), в параметры запроса, которые добавляются к URL.

Итак, вам нужно передать data как params в вашем запросе PUT с requests, а не data.Предполагая, что ваши текущие headers и data dicts:

response = requests.put('https://api.newrelic.com/v2/alerts_policy_channels.json', headers=headers, params=data)

Обратите внимание на аргумент ключевого слова params=data.

0 голосов
/ 11 июля 2019

установить данные = json.dumps (данные) вместо данных = данные

response = requests.put('https://api.newrelic.com/v2/alerts_policy_channels.json', headers=headers, data=json.dumps(data))
0 голосов
/ 11 июля 2019

500 код состояния - Внутренняя ошибка сервера, что означает, что сервер не может обработать запрос по неизвестной причине. Я предполагаю, что в вашем коде нет ничего плохого, и что это проблема сервера с их стороны ... Я заметил это на их сайте:

https://rpm.newrelic.com/api/explore/applications/update

500 Произошла ошибка сервера, обратитесь в службу поддержки New Relic

...