it-roy-ru.com

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-код с curl работает. Есть ли у вас какие-либо идеи, что я должен исправить в коде Python?

9
Konrad

В вашем примере с 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
2
Daniel Hepper

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

c.setopt(pycurl.HTTPHEADER, ['Accept:application/json'])

Я также предпочитаю использовать модуль запросов, потому что API/методы чисты и просты в использовании.

2
Brian

У меня была похожая проблема, и я использовал ваш пример кода, но обновил раздел httpheader следующим образом:

c.setopt(pycurl.HTTPHEADER, ['Content-Type:application/json'])
0
Ashwin Venkat