美文网首页
第十一章 在 Web 服务中定义自定义处理

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

作者: Cache技术分享 | 来源:发表于2024-08-02 07:33 被阅读0次

    第十一章 在 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 branch
        quit 0
       } elseif action["action2" {
          //details
          //quit 1
       }
    

    相关文章

      网友评论

          本文标题:第十一章 在 Web 服务中定义自定义处理

          本文链接:https://www.haomeiwen.com/subject/exlahjtx.html