文章
· 八月 4 阅读大约需 2 分钟

第十二章 在 Web 服务中定义自定义处理 - 实现 ProcessBody()

[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 服务中实现此方法,则该方法应执行以下操作:

  1. 检查操作并相应地分支。例如:
 if action["action1" { 
  //details
 }
  1. 使用 requestBodyRead() 方法获取 SOAP <Body>。例如:
 set request=requestBody.Read()
  1. 使用 $EXTRACT 等工具解析此流。例如:
 set in1="<echoString xmlns=""http://soapinterop.org/xsd""><inputString>"
 set in2="</inputString></echoString>"  
 set contents=$extract(request,$length(in1)+1,*-$length(in2))
  1. 如果在处理请求期间发生错误,则使用 ReturnFault() 方法以通常的方式返回错误。
  2. 使用响应流的 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. 如果创建了响应流,则返回 1。否则,返回 0,这导致运行与给定操作相关的 Web 方法。
讨论 (0)1
登录或注册以继续