Запрос curl POST в код pycurl
Я пытаюсь преобразовать следующий запрос curl в pycurl:
curl -v
-H Accept:application/json
-H Content-Type:application/json
-d "{
name: 'abc',
path: 'def',
target: [ 'ghi' ]
}"
-X POST http://some-url
у меня есть следующий код python:
import pycurl, json
c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://some-url')
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json'])
data = json.dumps({"name": "abc", "path": "def", "target": "ghi"})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.VERBOSE, 1)
c.perform()
print curl_agent.getinfo(pycurl.RESPONSE_CODE)
c.close()
при выполнении этого у меня была ошибка 415: неподдерживаемый тип носителя, поэтому я изменил:
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json'])
в:
c.setopt(pycurl.HTTPHEADER, [ 'Content-Type: application/json' , 'Accept: application/json'])
на этот раз у меня 400: плохой запрос. Но bash код с завитком работает. Вы знаете, что я должен исправить в коде python?
3 ответов
в вашем примере bash свойство target
является массивом, в вашем примере Python это строка.
попробуйте это:
data = json.dumps({"name": "abc", "path": "def", "target": ["ghi"]})
Я также настоятельно рекомендую вам проверить requests
библиотека, которая имеет гораздо более приятный API:
import requests
data = {"name": "abc", "path": "def", "target": ["ghi"]}
response = requests.post('http://some-url', json=data)
print response.status_code
Я знаю, что это уже больше года, но, пожалуйста, попробуйте удалить пробелы в вашем значении заголовка.
c.setopt(pycurl.HTTPHEADER, ['Accept:application/json'])
Я также предпочитаю использовать модуль запросов, потому что API/методы чисты и просты в использовании.
лучше просто использовать библиотеку запросов. (http://docs.python-requests.org/en/latest)
Я добавляю код python для ваших оригинальных пользовательских заголовков curl.
import json
import requests
url = 'http://some-url'
headers = {'Content-Type': "application/json; charset=xxxe", 'Accept': "application/json"}
data = {"name": "abc", "path": "def", "target": ["ghi"]}
res = requests.post(url, json=data, headers=headers)
print (res.status_code)
print (res.raise_for_status())