3

CURL を使用して Web サービスにファイルを POST しようとしています (これを使用する必要があるため、ツイストなどを使用できません)。問題は、ファイルの下部にコメントされている場合のように、pyCurl を使用すると、送信しているファイルを Web サービスが受信しないことです。私の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"
4

3 に答える 3

8

PyCurl は孤立したプロジェクトのようです。2年間更新されていません。コマンド ライン 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")
于 2010-11-11T14:35:57.087 に答える
1

次の方法でファイルのアップロードを試みてください。

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

于 2010-11-12T00:44:21.063 に答える
0

このような問題のトラブルシューティングは、問題が 1) コードにあるのか、2) 使用しているライブラリにあるのか、3) Web サービスにあるのか、またはそれらの組み合わせにあるのかが常に明確であるとは限らないため、面倒な場合があります。

PyCURL が実際にはアクティブなプロジェクトではないことはすでに確認されています。代わりに、 httplib2の上に書き直すことを検討してください。HTTP を話す多くの Python ライブラリの中で、CURL で行うことを再作成するための最良の候補かもしれません。

于 2011-01-02T17:01:44.603 に答える