<p>这不是一个“答案”,因为这个问题是客户端问题。但我现在把这个放在这里是为了搜索引擎。在</p>
<p>问题是请求消息是一种复杂类型。在</p>
<p>我的解决方案是在服务器端。我的服务现在接受请求中的非类型化元素。
请求主体的服务器端解析必须知道请求模式。一旦发生这种情况,服务器就可以对请求进行类型检查和解析,而无需客户端键入元素。在</p>
<p>具体来说,我的错误来自于使用pythonzsi模块和Zope实现的服务。在</p>
<blockquote>
<p>Any cannot parse untyped element</p>
</blockquote>
<p>这里,我得到了关于复杂请求对象的提示:<br/>
<a href="http://pypi.python.org/pypi/z3c.soap/" rel="nofollow noreferrer">http://pypi.python.org/pypi/z3c.soap/</a>(请参阅ValidateEmailRequest)</p>
<p>在这里,我在ZSI上了一个速成班:
<a href="https://stackoverflow.com/questions/7796440/are-there-any-working-examples-of-zolera-soap-infrastructure-zsi">Are there any working examples of Zolera SOAP Infrastructure (ZSI)?</a></p>
<p>这里还有不错的ZSI文档:<a href="http://pywebsvcs.sourceforge.net/zsi.html#SECTION0071100000000000000000" rel="nofollow noreferrer">http://pywebsvcs.sourceforge.net/zsi.html#SECTION0071100000000000000000</a></p>
<p>为了让ZSI满意,您只需创建一个表示请求消息的类,并向其添加一个类型代码。这就是为什么会看到很多服务指向“operation foo”和“fooRequest”和“fooResponse”,这样它们就可以将请求和响应对象作为xml复杂类型来输入。在</p>
<p>对于上面的例子,我将把类似这样的东西导入到正在解析soap请求主体的命名空间中。你可以变得更复杂,但这是所有必要的:</p>
<pre><code>import ZSI
class WriteRealTimeValuesRequest(object):
tagValues = array() #of TagValue
WriteRealTimeValuesRequest.typecode = ZSI.TC.Struct(WriteRealTimeValuesRequest,
(ZSI.TC.Array("TagValue",
TagValue.typecode,
"tagValues"
),
),
"WriteRealTimeValuesRequest")
</code></pre>
<p>“标记值是什么?”在</p>
^{pr2}$
<p>什么是品质?在</p>
<pre><code>class Quality(object):
Id = 0
QualityData = "I'm a string"
Quality.typecode = ZSI.TC.Struct(Quality,
(ZSI.TC.Integer("Id"), #this is the secret sauce
ZSI.TC.String("QualityData") #and here
),
"Quality")
</code></pre>
<p>以此类推,直到你一直深入到所有的原始类型。在</p>