2015-11-18 24 views
0

我遇到另一個可怕的錯誤TypeNotFound(Python 2.7版,無泡沫jurko == 0.6)Python的SUDS TypeNotFound複雜類型的名稱與Python的肥皂水 「__」

開始這些XSD的相關部分:

<xs:complexType final="extension restriction" name="requestHeader"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="type" type="tns:requestType"/> 
     <xs:element minOccurs="0" name="userID" type="xs:string"/> 
     <xs:element minOccurs="0" name="sessionID" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType final="extension restriction" name="requestType"> 
    <xs:sequence> 
     <xs:element name="__value" type="xs:int"/> 
    </xs:sequence> 
</xs:complexType> 

WSDL正確導入XSD,所以我不相信醫生會幫助:

<wsdl:definitions 
    name="FooBarService" 
    targetNamespace="foo.bar.ns" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:tns="foo.bar.ns" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 
<schema xmlns="http://www.w3.org/2001/XMLSchema"> 
<import namespace="foo.bar.ns" schemaLocation="someschemafile.xsd"/> 
<import namespace="http://jaxb.dev.java.net/array" schemaLocation="someschemafile2.xsd"/> 

而且someschemafile.xsd

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:ns1="http://jaxb.dev.java.net/array" 
    xmlns:tns="foo.bar.ns" 
    attributeFormDefault="unqualified" 
    elementFormDefault="unqualified" 
    targetNamespace="foo.bar.ns"> 

然後,我創建requestHeaderrequestType

q = soap_client.factory.create('requestHeader') 
print q 

(requestHeader){ 
    type = 
    (requestType){ 
     __value = None 
    } 
    userID = None 
    sessionID = None 
} 

然後:

q.type = soap_client.factory.create('requestType') 
q.type.__value = 42 
q.userID = "foo" 
q.sessionID = "bar" 
print q 

(requestHeader){ 
    type = 
     (requestType){ 
      __value = 42 
     } 
    userID = "foo" 
    sessionID = "bar" 
} 

,然後我嘗試調用使用requestHeader方法,在這之後,我得到:

TypeNotFound(u"Type not found: '__value'",) 
我也試過這個:
q = { 
    'type': 42, 
    'userID': "foo", 
    'sessionID': "bar" 
} 

但這呈現錯誤的SOAP消息:

<header> 
    <type>42</type> 
    <userID>foo</userID> 
    <sessionID>bar</sessionID> 
</header> 

,而不是

<header> 
    <type> 
     <__value>42</__value> 
    </type> 
    <userID>foo</userID> 
    <sessionID>bar</sessionID> 
</header> 

這到底是由服務拒絕。

很抱歉,我無法提供完整的WSDL和XSD,它們受到限制。

我能做些什麼來使泡沫創建正確的SOAP XML與__value元素?

我使用的是WSDL的本地副本,所以我可以對其進行更改,只要它能夠生成正確的SOAP XML。不過,我不知道要改變什麼。

編輯:增加了幾分清洗回溯(刪除的東西被稱爲SUDS方法之前)request是肥皂水對象,其中的一個屬性的類型是requestHeader

--------------------------------------------------------------------------- 
FooClientClass     Traceback (most recent call last) 
<ipython-input-4-8ccf453fe073> in <module>() 
----> 1 soap_client.service.someServiceMethod(request) 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/client.pyc in __call__(self, *args, **kwargs) 
    519   client = clientclass(self.client, self.method) 
    520   try: 
--> 521    return client.invoke(args, kwargs) 
    522   except WebFault, e: 
    523    if self.faults(): 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/client.pyc in invoke(self, args, kwargs) 
    574   timer.start() 
    575   binding = self.method.binding.input 
--> 576   soapenv = binding.get_message(self.method, args, kwargs) 
    577   timer.stop() 
    578   metrics.log.debug("message for '%s' created: %s", self.method.name, 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/bindings/binding.pyc in get_message(self, method, args, kwargs) 
    107   content = self.headercontent(method) 
    108   header = self.header(content) 
--> 109   content = self.bodycontent(method, args, kwargs) 
    110   body = self.body(content) 
    111   env = self.envelope(header, body) 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/bindings/document.pyc in bodycontent(self, method, args, kwargs) 
    93 
    94   parse_args(method.name, self.param_defs(method), args, kwargs, 
---> 95    add_param, self.options().extraArgumentErrors) 
    96 
    97   return root 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/argparser.pyc in parse_args(method_name, param_defs, args, kwargs, external_param_processor, extra_parameter_errors) 
    81  """ 
    82  arg_parser = _ArgParser(method_name, param_defs, external_param_processor) 
---> 83  return arg_parser(args, kwargs, extra_parameter_errors) 
    84 
    85 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/argparser.pyc in __call__(self, args, kwargs, extra_parameter_errors) 
    106   self.__init_run(args, kwargs, extra_parameter_errors) 
    107   try: 
--> 108    self.__process_parameters() 
    109    return self.__all_parameters_processed() 
    110   finally: 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/argparser.pyc in __process_parameters(self) 
    297   """Collect values for given web service operation input parameters.""" 
    298   for pdef in self.__param_defs: 
--> 299    self.__process_parameter(*pdef) 
    300 
    301  def __push_frame(self, ancestry_item): 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/argparser.pyc in __process_parameter(self, param_name, param_type, ancestry) 
    292   self.__stack[-1].process_parameter(param_optional, value is not None) 
    293   self.__external_param_processor(param_name, param_type, 
--> 294    self.__in_choice_context(), value) 
    295 
    296  def __process_parameters(self): 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/bindings/document.pyc in add_param(param_name, param_type, in_choice_context, value) 
    84    # Construct request data for the current input parameter. 
    85    pdef = (param_name, param_type) 
---> 86    p = self.mkparam(method, pdef, value) 
    87    if p is None: 
    88     return 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/bindings/document.pyc in mkparam(self, method, pdef, object) 
    128     tags.append(self.mkparam(method, pdef, item)) 
    129    return tags 
--> 130   return Binding.mkparam(self, method, pdef, object) 
    131 
    132  def param_defs(self, method): 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/bindings/binding.pyc in mkparam(self, method, pdef, object) 
    223   content = Content(tag=pdef[0], value=object, type=pdef[1], 
    224    real=pdef[1].resolve()) 
--> 225   return marshaller.process(content) 
    226 
    227  def mkheader(self, method, hdef, object): 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/core.pyc in process(self, content) 
    57   if isinstance(content.value, Property): 
    58    root = self.node(content) 
---> 59   self.append(document, content) 
    60   return document.root() 
    61 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/core.pyc in append(self, parent, content) 
    70   log.debug('appending parent:\n%s\ncontent:\n%s', parent, content) 
    71   if self.start(content): 
---> 72    self.appender.append(parent, content) 
    73    self.end(parent, content) 
    74 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/appender.pyc in append(self, parent, content) 
    86     appender = candidate_appender 
    87     break 
---> 88   appender.append(parent, content) 
    89 
    90 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/appender.pyc in append(self, parent, content) 
    227   for item in object: 
    228    cont = Content(tag=item[0], value=item[1]) 
--> 229    Appender.append(self, child, cont) 
    230 
    231 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/appender.pyc in append(self, parent, content) 
    166   @type content: L{Object} 
    167   """ 
--> 168   self.marshaller.append(parent, content) 
    169 
    170 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/core.pyc in append(self, parent, content) 
    70   log.debug('appending parent:\n%s\ncontent:\n%s', parent, content) 
    71   if self.start(content): 
---> 72    self.appender.append(parent, content) 
    73    self.end(parent, content) 
    74 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/appender.pyc in append(self, parent, content) 
    86     appender = candidate_appender 
    87     break 
---> 88   appender.append(parent, content) 
    89 
    90 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/appender.pyc in append(self, parent, content) 
    227   for item in object: 
    228    cont = Content(tag=item[0], value=item[1]) 
--> 229    Appender.append(self, child, cont) 
    230 
    231 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/appender.pyc in append(self, parent, content) 
    166   @type content: L{Object} 
    167   """ 
--> 168   self.marshaller.append(parent, content) 
    169 
    170 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/core.pyc in append(self, parent, content) 
    70   log.debug('appending parent:\n%s\ncontent:\n%s', parent, content) 
    71   if self.start(content): 
---> 72    self.appender.append(parent, content) 
    73    self.end(parent, content) 
    74 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/appender.pyc in append(self, parent, content) 
    86     appender = candidate_appender 
    87     break 
---> 88   appender.append(parent, content) 
    89 
    90 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/appender.pyc in append(self, parent, content) 
    227   for item in object: 
    228    cont = Content(tag=item[0], value=item[1]) 
--> 229    Appender.append(self, child, cont) 
    230 
    231 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/appender.pyc in append(self, parent, content) 
    166   @type content: L{Object} 
    167   """ 
--> 168   self.marshaller.append(parent, content) 
    169 
    170 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/core.pyc in append(self, parent, content) 
    69   """ 
    70   log.debug('appending parent:\n%s\ncontent:\n%s', parent, content) 
---> 71   if self.start(content): 
    72    self.appender.append(parent, content) 
    73    self.end(parent, content) 

/home/user/.virtualenvs/foo_project/local/lib/python2.7/site-packages/suds/mx/literal.pyc in start(self, content) 
    84    content.type = self.resolver.find(name, content.value) 
    85    if content.type is None: 
---> 86     raise TypeNotFound(content.tag) 
    87   else: 
    88    known = None 

TypeNotFound(u"Type not found: '__value'",) 
+0

「,然後我嘗試調用使用requestHeader方法,之後,我得到:「請顯示你打電話的方法。 – dopstar

+0

你必須記住的是,以'__variable'這樣的雙下劃線開頭的類變量對於python中的類是私有的(它們實際上被破壞不是真正的私有),這可能是你遇到困難的原因。如果必須,我會說停止使用雙下劃線或使用一個下劃線。通過使用破損的名字的籃球是可能的,但它真的很混亂,不pythonic,我會直接勸阻它。 – dopstar

+0

是的,我知道Python中有兩個下劃線,但是......我不是所請求的SOAP API的作者,我只是在使用它......而那個東西就是企業Java怪獸,其中雙下劃線名稱意味着什麼都沒有。 。我會看看我是否可以做一些事情來防止Python中的名稱混亂,也許這就是爲什麼SUDS會感到困惑。 Thnx – Tomislav

回答

0

按@dopstar評論的,這是因爲錯誤的在SUDS中。因爲我沒有時間試圖修復它的來源,我設計有點醜陋的解決方法

from lxml import etree 

etree_object = build_XML_using_etree() 

soap_client.service.someServiceMethod(
    __inject={'msg': etree.tostring(etree_object)} 
) 

醜陋的部分,其實並不是在這裏看到它是針織,因爲我們可以隱藏在背後build_XML_using_etree方法的XML的邏輯不要依賴SUDS在這裏做。

在另一方面,一旦原始XML注入SUDS棧,一切工作得很好,所以也許這不是那麼糟糕......