【问题标题】:python soap client librarypython 肥皂客户端库
【发布时间】:2012-09-02 19:35:07
【问题描述】:

我想使用 SOAP 协议查询 Internet 中的一项服务。在为 Python 搜索 SOAP 库时,这篇文章提供了丰富的信息:https://stackoverflow.com/a/206964。但是我尝试过的所有图书馆都没有为这个特定的服务工作。我有有效的 PHP 脚本:

<?php

$client = new SoapClient('https://personyze.com/site/service/service/social_archive/', array('trace' => true));
$result = $client->__soapCall
(   'select', array
    (   array('server_id'=>123456, 'api_key'=>123456), 'user_id', null, null, false, 0, 1
    )
);
echo $client->__getLastRequestHeaders(), $client->__getLastRequest(), "RESULT:\n";
var_dump($result);

我在 Python 中做了以下尝试:

1.

from suds.client import Client
client = Client("https://personyze.com/site/service/service/social_archive/")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/suds-0.3.7-py2.7.egg/suds/client.py", line 109, in __init__
    self.wsdl = Definitions(url, options)
  File "/usr/local/lib/python2.7/dist-packages/suds-0.3.7-py2.7.egg/suds/wsdl.py", line 194, in __init__
    self.build_schema()
  File "/usr/local/lib/python2.7/dist-packages/suds-0.3.7-py2.7.egg/suds/wsdl.py", line 255, in build_schema
    self.schema = container.load()
  File "/usr/local/lib/python2.7/dist-packages/suds-0.3.7-py2.7.egg/suds/xsd/schema.py", line 92, in load
    child.dereference()
  File "/usr/local/lib/python2.7/dist-packages/suds-0.3.7-py2.7.egg/suds/xsd/schema.py", line 295, in dereference
    midx, deps = x.dependencies()
  File "/usr/local/lib/python2.7/dist-packages/suds-0.3.7-py2.7.egg/suds/xsd/sxbasic.py", line 330, in dependencies
    raise TypeNotFound(self.ref)
suds.TypeNotFound: Type not found: '(Array, http://schemas.xmlsoap.org/soap/encoding/, )'

2.

from pysimplesoap.client import SoapClient
client = SoapClient(wsdl="https://personyze.com/site/service/service/social_archive/", trace=True)
client.select({"server_id":123456, "api_key":123456}, "user_id")

好多了!今天最好的结果。这个库唯一做错的事情是它调用方法selectRequest()而不是select()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 140, in <lambda>
    return lambda *args, **kwargs: self.wsdl_call(attr,*args,**kwargs)
  File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 289, in wsdl_call
    response = self.call(method, *params)
  File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 188, in call
    raise SoapFault(unicode(response.faultcode), unicode(response.faultstring))
pysimplesoap.client.SoapFault: SOAP-ENV:Server: Procedure 'selectRequest' not present

3.

import SOAPpy
client = SOAPpy.SOAPProxy("https://personyze.com/site/service/service/social_archive/", "urn:SocialArchiveServiceProviderwsdl")
client.select({"server_id":123456, "api_key":123456}, "user_id", None, None, False, 0, 2)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/SOAPpy-0.12.6-py2.7.egg/SOAPpy/Client.py", line 540, in __call__
    return self.__r_call(*args, **kw)
  File "/usr/local/lib/python2.7/dist-packages/SOAPpy-0.12.6-py2.7.egg/SOAPpy/Client.py", line 562, in __r_call
    self.__hd, self.__ma)
  File "/usr/local/lib/python2.7/dist-packages/SOAPpy-0.12.6-py2.7.egg/SOAPpy/Client.py", line 464, in __call
    p, attrs = parseSOAPRPC(r, attrs = 1)
  File "/usr/local/lib/python2.7/dist-packages/SOAPpy-0.12.6-py2.7.egg/SOAPpy/Parser.py", line 1074, in parseSOAPRPC
    t = _parseSOAP(xml_str, rules = rules)
  File "/usr/local/lib/python2.7/dist-packages/SOAPpy-0.12.6-py2.7.egg/SOAPpy/Parser.py", line 1054, in _parseSOAP
    parser.parse(inpsrc)
  File "/usr/lib/python2.7/xml/sax/expatreader.py", line 107, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/usr/lib/python2.7/xml/sax/xmlreader.py", line 123, in parse
    self.feed(buffer)
  File "/usr/lib/python2.7/xml/sax/expatreader.py", line 207, in feed
    self._parser.Parse(data, isFinal)
  File "/usr/lib/python2.7/xml/sax/expatreader.py", line 338, in start_element_ns
    AttributesNSImpl(newattrs, qnames))
  File "/usr/local/lib/python2.7/dist-packages/SOAPpy-0.12.6-py2.7.egg/SOAPpy/Parser.py", line 109, in startElementNS
    "got `%s'" % toStr( name )
SOAPpy.Errors.Error: <Error : expected `SOAP-ENV:Envelope', got `wsdl:definitions'>

请告诉我我该怎么做才能让它工作。

【问题讨论】:

    标签: python soap pysimplesoap


    【解决方案1】:

    服务器的 WSDL 架构似乎已损坏 - 它引用命名对象而不导入它们。

    请参阅suds documentation on fixing broken schemas,了解如何使用泡沫解决此问题。

    有关详细信息,另请参阅this question

    这似乎对我有用:

    from suds.xsd.doctor import Import
    from suds.xsd.doctor import ImportDoctor
    from suds.client import Client
    
    
    url = 'https://personyze.com/site/service/service/social_archive/'
    tns = 'urn:SocialArchiveServiceProviderwsdl'
    
    imp = Import('http://schemas.xmlsoap.org/soap/encoding/', 'http://schemas.xmlsoap.org/soap/encoding/')
    imp.filter.add(tns)
    client = Client(url,plugins=[ImportDoctor(imp)])
    
    print client.service.select({"server_id":123456, "api_key":123456}, "user_id")
    

    【讨论】:

    • 架构真的坏了。该服务使用 YII Framework 生成 schema,使用数组时无法生成有效的 schema。
    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2017-09-27
    • 2013-04-03
    • 2017-07-04
    相关资源
    最近更新 更多