当前位置:   article > 正文

第五章 创建 Web Services - 不需要 %XML.Adaptor 的输入和输出对象

第五章 创建 Web Services - 不需要 %XML.Adaptor 的输入和输出对象

第五章 创建 Web Services - 不需要 %XML.Adaptor 的输入和输出对象

不需要 %XML.Adaptor 的输入和输出对象

在大多数情况下,当使用对象作为 Web 方法的输入或输出时,该对象必扩展 %XML.Adaptor。例外情况如下:

  • 如果对象是 %ListOfDataTypes%ListOfObjects%ArrayOfDataTypes%ArrayOfObjects 或子类,则 SOAP 支持会隐式将该对象视为包含 %XML.Adaptor。不需要对这些类进行子类化。然而:
    • 必须在方法签名中指定 ELEMENTTYPE,如下所示:
Method MyMethod() As %ListOfObjects(ELEMENTTYPE="MyApp.MyXMLType") [WebMethod]
{
   //method implementation
}
  • 1
  • 2
  • 3
  • 4

或者,在输入参数的情况下:

Method MyMethod(input As %ListOfObjects(ELEMENTTYPE="MyApp.MyXMLType")) [WebMethod]
{
   //method implementation
}
  • 1
  • 2
  • 3
  • 4
  • 如果在 ELEMENTTYPE 中命名的类是对象类,则它必须从的 %XML.Adaptor继承。

  • 如果该对象是流类之一,则 SOAP 支持会隐式地将该对象视为包含 %XML.Adaptor。不需要对流类进行子类化。

如果它是字符流,则 SOAP 工具假定类型为字符串。如果它是二进制流,工具会将其视为 base-64 编码的数据。因此没有必要提供类型信息。

使用结果集作为输入或输出

可以使用结果集作为输入或输出,但方法取决于目标 Web 客户端。

  • 如果 Web 服务和客户端都基于 IRIS,或者其中之一基于 .NET,则可以在使用专用结果集类 %XML.DataSet,这将在“在 SOAP 消息中使用数据集”中进行讨论。或者可以使用类查询作为 Web 方法。 XML 表示形式自动与的 %XML.DataSet相同。
  • 要输出查询结果以便基于 JavaWeb 客户端可以使用它,请在子类中使用 %ListOfObjects

简单的例子

本节显示一个示例 Web 服务,以及它可以识别的请求消息和相应响应消息的示例。

/// MyApp.StockService
Class MyApp.StockService Extends %SOAP.WebService 
{

/// Name of the WebService.
Parameter SERVICENAME = "StockService";

/// TODO: change this to actual SOAP namespace.
/// SOAP Namespace for the WebService
Parameter NAMESPACE = "https://tempuri.org";

/// Namespaces of referenced classes will be used in the WSDL.
Parameter USECLASSNAMESPACES = 1;

/// This method returns tomorrow's price for the requested stock
Method Forecast(StockName As %String) As %Integer [WebMethod]
{
    // apply patented, nonlinear, heuristic to find new price
    Set price = $Random(1000)
    Quit price
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

当从 Web 客户端调用此方法时,客户端会向 Web 服务发送一条 SOAP 消息。该 SOAP 消息可能如下所示(为了便于阅读,在此处添加了换行符和空格):

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope 
xmlns:SOAP-ENV='https://schemas.xmlsoap.org/soap/envelope/' 
xmlns:xsi='https://www.w3.org/2001/XMLSchema-instance' 
xmlns:s='https://www.w3.org/2001/XMLSchema'>
  <SOAP-ENV:Body>
    <Forecast xmlns="https://tempuri.org">
     <StockName xsi:type="s:string">GZP</StockName>
    </Forecast>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意,消息体(<SOAP-ENV: body >元素)包含一个名为<Forecast>的元素,它是客户机调用的方法的名称。<Forecast>包含一个元素<StockName>,其名称基于我们正在调用的web方法的参数名称。此元素包含此参数的实际值。

web服务执行请求的操作,然后发送SOAP消息作为应答。响应消息可能如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope 
xmlns:SOAP-ENV='https://schemas.xmlsoap.org/soap/envelope/' 
xmlns:xsi='https://www.w3.org/2001/XMLSchema-instance' 
xmlns:s='https://www.w3.org/2001/XMLSchema'>
  <SOAP-ENV:Body>
    <ForecastResponse xmlns="https://www.myapp.org">
      <ForecastResult>799</ForecastResult>
    </ForecastResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这些示例不包括SOAP消息本身之前的HTTP标头。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/632717
推荐阅读
相关标签
  

闽ICP备14008679号