Проблемы с POST-записью с pyCurl

я пытаюсь отправить файл в веб-сервис, используя CURL (это то, что мне нужно использовать, поэтому я не могу использовать скрученный или что-то еще). Проблема в том, что при использовании pyCurl веб-сервис не получает файл, который я отправляю, как в случае, прокомментированном внизу файла. Что я делаю неправильно в своем скрипте pyCurl? Любые идеи?

Большое спасибо.

import pycurl
import os

headers = [ "Content-Type: text/xml; charset: UTF-8; " ]
url = "http://myurl/webservice.wsdl"
class FileReader:
    def __init__(self, fp):
        self.fp = fp
    def read_callback(self, size):
        text = self.fp.read(size)
        text = text.replace('\n', '')
        text = text.replace('\r', '')
        text = text.replace('\t', '')
        text = text.strip()
        return text

c = pycurl.Curl()
filename = 'my.xml'
fh = FileReader(open(filename, 'r'))

filesize = os.path.getsize(filename)
c.setopt(c.URL, url)
c.setopt(c.POST, 1)
c.setopt(c.HTTPHEADER, headers)
c.setopt(c.READFUNCTION , fh.read_callback)
c.setopt(c.VERBOSE, 1)
c.setopt(c.HTTP_VERSION, c.CURL_HTTP_VERSION_1_0)
c.perform()
c.close()
# This is the curl command I'm using and it works
# curl -d @my.xml -0 "http://myurl/webservice.wsdl" -H "Content-Type: text/xml; charset=UTF-8"

person rsavu    schedule 11.11.2010    source источник
comment
Мне просто интересно, вы нашли правильный ответ на свой вопрос?   -  person vonPetrushev    schedule 19.11.2010
comment
Каково значение вывода VERBOSE на стандартный вывод?   -  person dotancohen    schedule 03.12.2012


Ответы (3)


PyCurl кажется осиротевшим проектом. Он не обновлялся два года. Я просто вызываю командную строку curl как подпроцесс.

import subprocess

def curl(*args):
    curl_path = '/usr/bin/curl'
    curl_list = [curl_path]
    for arg in args:
        # loop just in case we want to filter args in future.
        curl_list.append(arg)
    curl_result = subprocess.Popen(
                 curl_list,
                 stderr=subprocess.PIPE,
                 stdout=subprocess.PIPE).communicate()[0]
    return curl_result 

curl('-d', '@my.xml', '-0', "http://myurl/webservice.wsdl", '-H', "Content-Type: text/xml; charset=UTF-8")
person mjhm    schedule 11.11.2010

Попробуйте выполнить загрузку файла таким образом:

c.setopt(c.HTTPPOST, [("filename.xml", (c.FORM_FILE, "/path/to/file/filename.xml"))])

person vonPetrushev    schedule 12.11.2010

Устранение неполадок, подобных этой, может быть болезненным, потому что не всегда ясно, в чем проблема: 1) в вашем коде, 2) в библиотеке, которую вы используете, 3) в веб-службе или в какой-то комбинации.

Уже было замечено, что PyCURL на самом деле не является активным проектом. Попробуйте вместо этого переписать поверх http://code.google.com/p/httplib2/. Из многих библиотек Python, говорящих на HTTP, она может быть лучшим кандидатом для воссоздания того, что вы делаете с помощью CURL.

person Paul Bissex    schedule 02.01.2011