我遇到另一個可怕的錯誤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">
然後,我創建requestHeader
和requestType
:
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'",)
「,然後我嘗試調用使用requestHeader方法,之後,我得到:「請顯示你打電話的方法。 – dopstar
你必須記住的是,以'__variable'這樣的雙下劃線開頭的類變量對於python中的類是私有的(它們實際上被破壞不是真正的私有),這可能是你遇到困難的原因。如果必須,我會說停止使用雙下劃線或使用一個下劃線。通過使用破損的名字的籃球是可能的,但它真的很混亂,不pythonic,我會直接勸阻它。 – dopstar
是的,我知道Python中有兩個下劃線,但是......我不是所請求的SOAP API的作者,我只是在使用它......而那個東西就是企業Java怪獸,其中雙下劃線名稱意味着什麼都沒有。 。我會看看我是否可以做一些事情來防止Python中的名稱混亂,也許這就是爲什麼SUDS會感到困惑。 Thnx – Tomislav