将Perl SOAP应用移植到Python

3 投票
1 回答
520 浏览
提问于 2025-04-17 15:57

我现在正在把我的Perl SOAP通信应用程序转移到Python上,但遇到了一个问题,urllib2通过suds抛出了一个错误。我之前的Perl SOAP脚本是:

use myStub;
$ENV{HTTPS_PKCS12_FILE} = '/path/to/certificate';
$ENV{HTTPS_PKCS12_PASSWORD} = 'password';
my $client = new myStub;
my $output = $client->foo('test', 'something');
print $output

这里的myStub是由stubmaker.pl生成的.pm文件,属于SOAP::Lite的一部分。

然后我把我的Python脚本设置成这样:

from suds.client import Client
import os

os.environ['HTTPS_PKCS12_FILE'] = '/path/to/certificate'
os.environ['HTTPS_PKCS12_PASSWORD'] = 'password'
client = Client('file:WSDL')
output = client.service.foo('test', 'something')
print output

结果是:

File "test.py", line 12, in <module>
    output = client.service.foo('test', 'something')
  File "/usr/lib/python2.6/site-packages/suds/client.py", line 542, in __call__
    return client.invoke(args, kwargs)
  File "/usr/lib/python2.6/site-packages/suds/client.py", line 602, in invoke
    result = self.send(soapenv)
  File "/usr/lib/python2.6/site-packages/suds/client.py", line 643, in send
    reply = transport.send(request)
  File "/usr/lib/python2.6/site-packages/suds/transport/https.py", line 64, in send
    return  HttpTransport.send(self, request)
  File "/usr/lib/python2.6/site-packages/suds/transport/http.py", line 77, in send
    fp = self.u2open(u2request)
  File "/usr/lib/python2.6/site-packages/suds/transport/http.py", line 118, in u2open
    return url.open(u2request, timeout=tm)
  File "/usr/lib64/python2.6/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/usr/lib64/python2.6/urllib2.py", line 409, in _open
    '_open', req)
  File "/usr/lib64/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib64/python2.6/urllib2.py", line 1198, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "/usr/lib64/python2.6/urllib2.py", line 1165, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 8] _ssl.c:490: EOF occurred in violation of protocol>

我的客户端创建得很好,如果我打印出来,会看到预期的方法被列出来等等。

1 个回答

5

看起来 urllib2 不能和服务器正常沟通。我怀疑 urllib2 并没有关注 HTTPS_PKCS12_* 这些环境变量。我猜这些可能是你之前用的 Perl 库或者 Perl 本身特有的东西。urllib2 根本不进行 SSL 证书的验证,如果你需要这个功能,使用 pycurl 会更好。

这两个问题可能会给你一些帮助:

撰写回答