使用pyCurl时遇到POST问题
我正在尝试用CURL把一个文件发送到一个网络服务(我必须使用CURL,所以不能用其他工具,比如twisted)。问题是,当我使用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 个回答
0
遇到这样的故障问题真让人头疼,因为一开始并不清楚问题出在哪里:是你的代码有问题,还是你用的库有问题,还是网络服务出了问题,或者是这些因素的组合。
已经有人注意到,PyCURL这个项目其实并不活跃。可以考虑在httplib2的基础上重写代码。对于许多处理HTTP请求的Python库来说,httplib2可能是最适合用来替代CURL的选择。
1
试着用这种方式来上传文件:
c.setopt(c.HTTPPOST, [("filename.xml", (c.FORM_FILE, "/path/to/file/filename.xml"))])
8
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")