欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 第十一章 在 Web 服务中定义自定义处理

第十一章 在 Web 服务中定义自定义处理

2024/10/24 5:17:09 来源:https://blog.csdn.net/yaoxin521123/article/details/140884518  浏览:    关键词:第十一章 在 Web 服务中定义自定义处理

文章目录

  • 第十一章 在 Web 服务中定义自定义处理
  • 在 Web 服务中定义自定义处理
  • 概述
  • 实现 `ProcessBodyNode()`

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

  1. 检查操作并相应地分支。例如:
 if action["action1" { //details}
  1. 如果需要访问 SOAP <Envelope> (例如,访问其命名空间声明),请使用 body 的 Document 属性。这相当于 %XML.Document 的一个实例,它将 SOAP 信封表示为 DOM(文档对象模型)。否则,直接使用主体。
  2. 现在有以下选择:
  • 使用 %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 转换。
  1. 如果在处理请求期间发生错误,则使用 ReturnFault() 方法以通常的方式返回错误。
  2. 使用响应流的 Write() 方法写入将成为 <Body> 子元素的 XML 片段。
  3. 如果创建了响应流,则返回 1。否则,返回 0,这导致 IRIS 运行与给定操作相关的 Web 方法。
  if action["action1" { //no custom processing for this branchquit 0} elseif action["action2" {//details//quit 1}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com