Проблемы POST-ин с pyCurl - PullRequest
       13

Проблемы POST-ин с pyCurl

3 голосов
/ 11 ноября 2010

Я пытаюсь отправить файл в веб-сервис, используя 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"

Ответы [ 3 ]

8 голосов
/ 11 ноября 2010

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")
1 голос
/ 12 ноября 2010

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

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

0 голосов
/ 02 января 2011

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

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

...