Ошибка при передаче параметра curl -d в библиотеке запросов

#python #csv #curl #python-requests

#python #csv #curl #python-запросы

Вопрос:

У меня есть curl запрос POST, который отлично работает в терминале (macOS), возвращая csv, как и ожидалось. Следующий формат указан в документации RJMetrcis (см. «Экспорт данных рисунка»). Вот запрос curl в bash:

  curl -d "format=csvamp;includeColumnHeaders=1" -H "X-RJM-API-Key: myAPIkey" https://api.rjmetrics.com/0.1/figure/0000/export
  

Моя цель — реализовать точно такой же запрос curl в Python с использованием requests . Когда я ввожу те же параметры, что и POST-запрос, код не работает, возвращая ошибку:

 import requests


headers = {'X-RJM-API-Key: myAPIkey'}
data= {'format=csvamp;includeColumnHeaders=1'}
url = "https://api.rjmetrics.com/0.1/figure/0000/export"

response = requests.post(url, data, headers)
  

Это возвращает ошибку:

 TypeError: memoryview: a bytes-like object is required, not 'str'
  

Со второй попытки:

 response = requests.post(url, data=data, headers=headers)
  

ВОЗВРАТ

 AttributeError: 'set' object has no attribute 'items'
  

Каков правильный формат в python для построения POST-запроса, чтобы он соответствовал data = {'key':'value'} соглашению и возвращал csv?Любая помощь будет оценена по переводу сообщения bash curl в запрос python POST

Ответ №1:

Здесь вы передаете set, и ожидается, что вы передадите объект dict или str

 data= {'format=csvamp;includeColumnHeaders=1'}
  

Замена на

 data= {'format':'csvamp;includeColumnHeaders=1'}
  

Это должно быть исправлено.

С другой стороны, увидев ваш запрос curl..

Все зависит от того, как вы хотите передать данные, следующий код (передача полезной нагрузки данных в виде строки) будет отправлять данные напрямую, что будет эквивалентно —data-raw в curl

 import requests

url = "https://api.rjmetrics.com/0.1/figure/0000/export"

payload = "'{"format":"csvamp;includeColumnHeaders=1"}'"
headers = {
  'X-RJM-API-Key': 'myAPIkey'
}

response = requests.request("POST", url, headers=headers, data = payload)

print(response.text.encode('utf8'))
  

Комментарии:

1. Спасибо, это что-то возвращает, хотя, похоже, возвращает строку json

2. «выводит данные, используемые для создания фигуры с указанным идентификатором» из devdocs.magento.com/mbi/docs/export-api.html#export-figure-data это и есть строка json, которую вы получаете? я думаю, что для получения csv у api должен быть запрос GET для этого

3. Да, это возвращаемый JSON