Сверните POST в код pycurl

Я пытаюсь преобразовать следующий запрос curl в pycurl:

curl -v \
--user username:passwd \
-H X-Requested-By:MyClient \
-H Accept:application/json \
-X POST \
http://localhost:7001/some_context

И это работает. Не работает следующее:

import pycurl, json

url = "http://localhost:7001/some_context"
c = pycurl.Curl()
data = json.dumps(None)
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json', 'X-Requested-By:MyClient'])
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.USERPWD, "username:passwd")
c.perform()

Но при выполнении этого у меня возникает ошибка 415: неподдерживаемый тип носителя. Есть ли у вас какие-либо идеи? Я бы предпочел остаться с pycurl - я знаю о библиотеке запросов...


person Konrad    schedule 14.03.2016    source источник
comment
Я отмечаю, что в первом примере вы не передаете данные. Во втором вы передаете строку application/x-www-form-urlencoded.   -  person Robᵩ    schedule 14.03.2016
comment
Вот полезный прием: замените URL в обоих примерах на http://httpbin.org/post и проверьте подробный вывод.   -  person Robᵩ    schedule 14.03.2016


Ответы (2)


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

import pycurl, json

url = "http://localhost:7001/some_url"
url= 'http://httpbin.org/post'
c = pycurl.Curl()
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDSIZE, 0)
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json',
                             'X-Requested-By:MyClient',
                             'Content-Type:',
                             'Content-Length:'])
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.USERPWD, "username:passwd")
c.perform()
person Robᵩ    schedule 14.03.2016
comment
Я дважды пытался отредактировать это, и оба раза оно было отклонено. Итак, давайте попробуем комментарий. Удалите второе присвоение url из кода примера. Оно не является частью исходного сообщения и делает первое назначение (которое является частью исходного кода) бессмысленным. Вероятно, это просто то, что было пропущено во время копирования/вставки. Надеюсь, @avariant и @Suraj Kumar не отвергнут это... - person Z4-tier; 12.06.2019
comment
Нет, @Z4-tier, это не случайно. Он включен специально для того, чтобы преобразовать нерабочий образец ОП в реальный рабочий образец. Возможно, мое намерение было неясным, и я должен был добавить комментарий. - person Robᵩ; 18.06.2019
comment
Дело не в том, что непонятно. Скорее, как написано в настоящее время, утверждение «Этот скрипт имитирует вашу командную строку curl:» неверно. Извините, что мудрствую, но речь идет о программировании, а правильность программы важна. - person Z4-tier; 18.06.2019
comment
Спасибо, @Z4-уровень. Я не уловил вашего беспокойства из предложенного вами редактирования. Надеюсь, мое недавнее изменение решит вашу проблему. - person Robᵩ; 21.06.2019

Данные вашего поста неверны, согласно http://pycurl.io/docs/latest/quickstart.html#sending-form-data ожидается dict, а не строка. (json.dumps(None) == 'null')

Ошибка, которую вы получаете от своего веб-сервера, скорее всего, связана с этим.

import pycurl, json

url = "http://localhost:7001/some_url"
c = pycurl.Curl()
data = {'whatever_field': None}
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json', 'X-Requested-By:MyClient'])
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.USERPWD, "username:passwd")
c.perform()
person Maresh    schedule 14.03.2016