[toc]
第十二章 在 Web 服务中定义自定义处理 - 实现 ProcessBody()
实现 ProcessBody()
ProcessBody()
方法具有以下签名:
method ProcessBody(action As %String, requestBody As %CharacterStream,
ByRef responseBody As %CharacterStream) as %Boolean
其中:
- action
是入站消息中指定的 SOAP
操作。
- requestBody
是 %Library.CharacterStream
的一个实例,包含 SOAP
<Body>
元素。该流包含 XML
片段,而不是完整的 XML
文档。
- responseBody
,是序列化为 %Library.CharacterStream
实例的响应主体。此流通过引用传递,最初为空。
如果在 Web
服务中实现此方法,则该方法应执行以下操作:
- 检查操作并相应地分支。例如:
if action["action1" {
//details
}
- 使用
requestBody
的Read()
方法获取SOAP <Body>
。例如:
set request=requestBody.Read()
- 使用
$EXTRACT
等工具解析此流。例如:
set in1="<echoString xmlns=""http://soapinterop.org/xsd""><inputString>"
set in2="</inputString></echoString>"
set contents=$extract(request,$length(in1)+1,*-$length(in2))
- 如果在处理请求期间发生错误,则使用
ReturnFault()
方法以通常的方式返回错误。 - 使用响应流的
Write()
方法写入将成为<Body>
子元素的XML
片段。例如:
set in1="<echoString xmlns=""http://soapinterop.org/xsd""><inputString>"
set in2="</inputString></echoString>"
set request=requestBody.Read()
if ($extract(request,1,$length(in1))'=in1) || ($extract(request,*-$length(in2)+1,*)'=in2) {
do responseBody.Write("Bad Request: "_request)
quit 1
}
set out1="<echoStringResponse xmlns=""http://soapinterop.org/xsd""><echoStringResult>"
set out2="</echoStringResult></echoStringResponse>"
do responseBody.Write(out1)
do responseBody.Write($extract(request,$length(in1)+1,*-$length(in2)))
do responseBody.Write(out2)
- 如果创建了响应流,则返回
1
。否则,返回 0,这导致运行与给定操作相关的Web
方法。