第十一章 在 Web 服务中定义自定义处理
在 Web 服务中定义自定义处理
在极少数情况下,定义使用自定义处理来处理入站消息和构建响应消息的 台 Web
服务可能会很有用。在这些情况下,可以在 Web
服务中实现 ProcessBodyNode()
方法或 ProcessBody()
方法。本主题提供了详细信息。
概述
在自定义处理中,可以解析入站消息并手动构建响应。要求如下:
-
在
Web
服务中,可以定义具有所需签名的Web
方法。这样做是为了建立Web
服务的WSDL
。这些Web
方法(或其中一些)可以是存根。仅当ProcessBodyNode()
或ProcessBody()
返回0
时,才会执行方法。 -
此外,在
Web
服务中,可以实现以下方法之一:-
ProcessBodyNode()
— 此方法接收SOAP
主体作为%XML.Node
的实例。可以使用XML
工具处理此实例并构建响应消息。SOAP
信封中%XML.Node
的此实例的Document
属性中可用。 -
ProcessBody()
— 此方法以流的形式接收SOAP
主体。由于SOAP
主体是XML
片段而不是XML
文档,因此您无法使用XML
工具来读取它。相反,可以使用ObjectScript
函数解析流并提取所需的部分。
如果同时定义这两种方法,则会忽略
ProcessBodyNode(
) 方法。 -
无论哪种情况,构建的响应消息都必须与 Web
服务的 WSDL
一致。
实现 ProcessBodyNode()
ProcessBodyNode()
方法具有以下签名:
method ProcessBodyNode(action As %String, body As %XML.Node,
ByRef responseBody As %CharacterStream) as %Boolean
其中:
-
action
是入站消息中指定的SOAP
操作。 -
body
是%XML.Node
的一个实例,中包含SOAP <Body>
。 -
responseBody
是序列化为%Library.CharacterStream
实例的响应主体。此流通过引用传递,最初为空。
如果在 Web
服务中实现此方法,则该方法应执行以下操作:
- 检查操作并相应地分支。例如:
if action["action1" {
//details
}
- 如果需要访问
SOAP <Envelope>
(例如,访问其命名空间声明),请使用 body 的Document
属性。这相当于%XML.Document
的一个实例,它将SOAP
信封表示为DOM
(文档对象模型)。否则,直接使用主体。 - 现在有以下选择:
- 使用
%XML.Write
将正文写为字符串,然后就可以对其进行操作。例如:
set writer=##class(%XML.Writer).%New()
do writer.OutputToString()
do writer.DocumentNode(body)
set request=writer.GetXMLString(.sc)
// check returned status and continue
- 根据需要使用
%XML.Document
或%XML.Node
浏览文档。同样,使用%XML.Document
或的方法%XML.Node
访问有关文档当前部分的信息。 - 使用
XPath
表达式提取数据。 - 执行
XSLT
转换。
- 如果在处理请求期间发生错误,则使用
ReturnFault()
方法以通常的方式返回错误。 - 使用响应流的
Write()
方法写入将成为<Body>
子元素的XML
片段。 - 如果创建了响应流,则返回
1
。否则,返回0
,这导致IRIS
运行与给定操作相关的Web
方法。
if action["action1" {
//no custom processing for this branch
quit 0
} elseif action["action2" {
//details
//quit 1
}
网友评论