XForms/Web 服务
外观
< XForms
可以使用模型中的submission
元素直接从 XForms 应用程序调用 Web 服务。
要调用 Web 服务,首先需要将其“连接”到事件。例如,这可以是表单末尾的“提交”按钮。
提交元素通常位于演示文稿中(在 body 标签内),并连接到模型中的 <submission> 元素。
<head>
<xf:model id="my-model">
<xf:submission id="<b>callWebService</b>">
<...>
</xf:submission>
</xf:model>
</head>
<body>
<xf:submit submission="<b>callWebService</b>">
<xf:label>Press Button to Call a Web Service</xf:label>
</xf:submit>
</body>
</<syntaxhighlight>
== Sample Program ==
The program consists of several parts.
In the model:
# The SOAP submission instance
# The submission
# The SOAP response placeholder
=== SOAP input message ===
Here is an example of the input SOAP message
<pre>
<!-- What we send to the web service -->
<xf:instance id="submit-instance" xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Envelope>
<soap-env:Body>
<m:test xmlns:m="http://www.example.com/web-services/my-operation"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<string xsi:type="xsd:string">Hello world!</string>
</m:test>
</soap-env:Body>
</soap-env:Envelope>
</xf:instance>
<!-- /env:Envelope/env:Body/m:ecrvTestResponse/result -->
</pre>
=== Putting the SOAP Results in an Instance ===
When the web service returns you need to put the returning SOAP response in an instance. We create another instance in the model and we also need to give it an identifier. In this case I called it "results-instance".
<syntaxhighlight lang="xml">
<xf:instance id="results-instance" xmlns="">
<env:Envelope/>
</xf:instance>
<xf:bind id="results-bind" nodeset="instance('results-instance')/env:Envelope"/>
这只是一个临时存储区,结果将被插入到其中。
<xf:submission id="send-to-dor-document-web-service"
action="<nowiki>http://www.example.com/web-service/my-web-service</nowiki>"
method="post"
mediatype="text/xml"
ref="instance('submit-instance')"
replace="instance"
instance="results-instance">
<xf:toggle case="case-busy" ev:event="xforms-submit" />
<xf:toggle case="case-submit-error" ev:event="xforms-submit-error" />
<xf:toggle case="case-done" ev:event="xforms-submit-done" />
</xf:submission>
需要注意几件事。action
属性是 Web 服务连接点的 URL。您调用的操作不包含在 URL 中。
在这种情况下,方法(get、put 或 post)是 post。
XForms 是一种功能丰富的应用程序开发标准。因此,XForms 使用的 HTTP 事务默认情况下使用一种媒体类型,用于包含二进制文件和二进制附件的 XML 应用程序。因此,默认情况下,XForms 会发送包含以下内容的 HTTP 命令
mediatype="application/xml"
但是,大多数简单的 Web 服务不支持二进制。ASCII 文本(不含二进制)的mediatype
只是
mediatype="text/xml"
因此,如果您还要发送二进制文件,则需要向提交添加媒体类型属性
<xf:submission mediatype="application/xml"...
您还可以用 XML 结果替换整个文档(选项是 replace="all"),或者也可以让它仅替换实例。
最后三个 <toggle> 语句用于显示结果。
这使得错误消息为红色,而正确的响应为绿色。
<style type="text/css"> @namespace xf url("http://www.w3.org/2002/xforms"); body {font-family: Helvetica, sans-serif} .code {font-family: Courier New, fixed-width; font-weight:bold;} .error-message {font-weight:bold; color: red} .ok {font-weight:bold; color: green} xf|output {font-weight:bold; font-size: 16pt} </style>
这是 XForms 文档的实际主体。它有一个调用 Web 服务的单个按钮。
<body> <h1>Web Service Demo</h1> <p>Note: With some browsers (FireFox) you must add the appropriate hosts to your XForms "white list" for this application to run. With FireFox see Tools/Options/Content tab.</p> <xf:submit submission="call-web-service"> <xf:label>Call Web Service</xf:label> </xf:submit> <hr/> <p>Current form status:</p> <xf:switch> <xf:case id="case-start">Status: Ready to call web service.</xf:case> <xf:case id="case-busy">Waiting for response...please stand by...</xf:case> <xf:case id="case-submit-error"> <p class="error-message">Submission error. Did you remember to allow XForms to submit data to other domains?</p> </xf:case> <xf:case id="case-done"> <p class="ok">Results returned successfully</p> <xf:group model="my-model"> <xf:output ref="instance('results-instance')/env:Body/m:my-results/result"> <xf:label>Return value: </xf:label> </xf:output> </xf:group> </xf:case> </xf:switch> </body>
演示文稿使用 switch/case 部分有条件地显示错误消息。每个切换元素都由相应的事件触发。
您还可以在该部分中放置一个旋转的 GIF 图标,以便从服务器获取响应时获得动画。