方法关键字SoapBindingStyle,SoapBodyUse,SoapMessageName,SoapNameSpace

2022-07-07 10:45:23 浏览数 (1)

第七十七章 方法关键字 - SoapBindingStyle

指定此方法用作web方法时使用的绑定样式或SOAP调用机制。仅适用于定义为web服务web客户端的类。

用法

若要重写方法使用的默认绑定样式(当它用作web方法时),请使用以下语法:

代码语言:javascript复制
Method name(formal_spec) As returnclass [ WebMethod, SoapBindingStyle = soapbindingstyle ]  
{    //implementation }

其中soapbindingstyle是下列之一:

  • document文档(默认)—此web方法使用文档样式的调用。

使用这种绑定风格,SOAP消息被格式化为文档,并且通常只有一个部分。

SOAP消息中,<Body>元素通常包含一个子元素。<Body>元素的每个子元素对应于一个消息部分。

  • rpc —这个web方法使用rpc(远程过程调用)风格的调用。

使用这种绑定风格,SOAP消息被格式化为具有多个部分的消息。

SOAP消息中,<Body>元素包含一个子元素,其名称取自相应的操作名称。这个元素是一个生成的包装元素,它为方法的参数列表中的每个参数包含一个子元素。

重要提示:对于手动创建的web服务,该关键字的默认值通常是合适的。当使用SOAP向导从WSDL生成web客户端服务时,InterSystems IRIS会将此关键字设置为适合该WSDL;如果修改该值,web客户端或服务可能不再工作。

详解

此关键字允许指定web方法使用的绑定样式。它影响SOAP主体的格式(但不影响任何SOAP头)。

默认

如果省略此关键字,则<soap:operation>元素的样式属性将改为由SoapBindingStyle类关键字的值确定。

与WSDL的关系

SoapBindingStyle方法关键字指定了WSDL的<binding>部分中< soap:operation >元素的样式属性的值。例如,如果SoapBindingStyle方法关键字是document,则WSDL可能如下所示:

代码语言:javascript复制
...
<binding ...>
 ...
    <operation ...>
        <soap:operation ... style="document"/>
...

相比之下,如果SoapBindingStylerpc,则WSDL可以改为如下所示:

代码语言:javascript复制
...
<binding ...>
 ...
    <operation ...>
        <soap:operation ... style="rpc"/>
...

绑定样式还会影响web方法的请求和响应<message>元素,如下所示:

= 如果绑定样式是文档,默认情况下,每条消息只有一个部分。例如:

代码语言:javascript复制
<message name="AddSoapIn">
    <part name="parameters" .../>
</message>

如果ARGUMENTSTYLE参数是message,那么一条消息可以有多个部分。例如:

代码语言:javascript复制
<message name="AddSoapIn">
   <part name="a" .../>
   <part name="b" .../>
</message>
  • 如果绑定样式是rpc,消息可以有多个部分。例如:
代码语言:javascript复制
<message name="AddSoapIn">
    <part name="a" .../>
    <part name="b" .../>
</message>

与 %XML.DataSet 一起使用

如果将此关键字与使用 %XML.DataSet 类型的对象作为输入或输出的方法一起使用,则存在一些限制。

第七十八章 方法关键字 - SoapBodyUse

当此方法用作 Web方法时,指定此方法的输入和输出使用的编码。仅适用于定义为 Web服务Web客户端的类。

用法

若要重写方法的输入和输出使用的默认编码(当它用作web方法时),请使用以下语法:

代码语言:javascript复制
Method name(formal_spec) As returnclass [ WebMethod, SoapBodyUse = soapbodyuse ] 
{    //implementation }

其中soapbodyuse是下列之一:

  • literal文字(默认)-此web方法使用文字数据。也就是说,SOAP消息<Body>中的XMLWSDL中给出的模式完全匹配。
  • encoded编码——这个web方法使用SOAP编码的数据。也就是说,SOAP消息<Body>中的XML使用了适合所使用的SOAP版本的SOAP编码,如以下规范所要求的:
    • SOAP 1.1 (https://www.w3.org/TR/2000/NOTE-SOAP-20000508/)
    • SOAP 1.2 (https://www.w3.org/TR/soap12-part2/)

重要提示:对于手动创建的web服务,该关键字的默认值通常是合适的。当使用SOAP向导从WSDL生成web客户端或服务时,InterSystems IRIS会将此关键字设置为适合该WSDL;如果修改该值,web客户端或服务可能不再工作。

详情

此关键字指定web方法的输入和输出的编码。

默认

如果省略此关键字,将使用SoapBodyUse类关键字的值。

与 %XML.DataSet 一起使用

如果将此关键字与使用 %XML.DataSet 类型的对象作为输入或输出的方法一起使用,则存在一些限制。

第七十九章 方法关键字 - SoapMessageName

指定此web方法的响应消息的<part>元素的name属性。 仅适用于定义为web服务web客户端的类。

用法

要覆盖响应消息的<part>元素的默认名称,请使用以下语法:

代码语言:javascript复制
Method name(formal_spec) As returnclass [ WebMethod, SoapMessageName = MyResponse ] 
{    //implementation }

其中soapmessagename是在XML中有效的任何标识符。

详解

注意:此关键字仅对使用SoapBindingStyle等于document(这是默认设置)的web方法有效。

此关键字指定响应消息正文的子元素的名称。

默认

如果省略此关键字,消息名称就是结尾附加了响应的web方法的名称。

web方法的名称取自web服务中的web方法定义;这只能通过重命名该方法来更改。

与WSDL的关系

SoapMessageName关键字影响web服务WSDL<messages><types>部分。例如,以下web方法:

代码语言:javascript复制
Method Add(a as %Numeric,b as %Numeric) As %Numeric [ SoapMessageName=MyResponseMessage,WebMethod ]
{
    Quit a   b
}

对于这个web服务,WSDL的<types><messages>部分如下所示:

代码语言:javascript复制
<types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://www.mynamespace.org">
        <s:element name="Add">
            <s:complexType>
                <s:sequence>
                    <s:element minOccurs="0" name="a" type="s:decimal"/>
                    <s:element minOccurs="0" name="b" type="s:decimal"/>
                </s:sequence>
            </s:complexType>
        </s:element>
        <s:element name="MyResponseMessage">
            <s:complexType>
                <s:sequence>
                    <s:element name="AddResult" type="s:decimal"/>
                </s:sequence>
            </s:complexType>
        </s:element>
    </s:schema>
</types>
<message name="AddSoapIn">
    <part name="parameters" element="s0:Add"/>
</message>
<message name="AddSoapOut">
    <part name="parameters" element="s0:MyResponseMessage"/>
</message>

默认情况下,如果方法没有指定SoapMessageName关键字,AddSoapOut消息将包含一个名为addressponse的元素,而不是MyResponseMessa

注意,SoapMessageName不影响响应消息的子元素(例如AddResult)。

如果使用SOAP WizardWSDL生成web服务或客户端,InterSystems IRIS将此关键字设置为适合该WSDL的关键字。

对SOAP消息的影响

web服务可能会发送如下响应消息:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Body>
   <MyResponseMessage xmlns="http://www.mynamespace.org">
       <AddResult>42</AddResult>
   </MyResponseMessage>  
</SOAP-ENV:Body>

默认情况下,如果该方法没有指定SoapMessageName关键字,则<MyResponseMessage>元素将改为<addressponse>

第八十章 方法关键字 - SoapNameSpace

指定web方法使用的XML命名空间。 仅适用于定义为web服务web客户端的类。

用法

要覆盖方法使用的默认XML命名空间(当该方法作为一个web方法使用时),请使用以下语法:

代码语言:javascript复制
Method name(formal_spec) As returnclass [ SoapNameSpace = "soapnamespace", WebMethod ] 
{    //implementation }

其中soapnamespace是一个命名空间URI。 注意,如果URI包含冒号(:),则字符串必须用引号括起来。 也就是说,你可以使用以下方法:

代码语言:javascript复制
Method MyMethod() [ SoapNameSpace = "http://www.mynamespace.org", WebMethod ] 

或以下:

代码语言:javascript复制
Method MyMethod() [ SoapNameSpace = othervalue, WebMethod ] 

但不包括以下内容:

代码语言:javascript复制
Method MyMethod() [ SoapNameSpace = http://www.mynamespace.org, WebMethod ] 

重要提示:对于手动创建的web服务,该关键字的默认值通常是合适的。 使用SOAP向导从WSDL生成web客户端或服务时,InterSystems IRIS将此关键字设置为适合该WSDL的关键字; 如果修改该值,web客户端或服务可能不再工作。

详解

这个关键字指定了这个web方法使用的XML名称空间。

注意:这个关键字只有在方法使用rpc样式绑定时才有效果。 也就是说,方法(或包含它的类)必须用SoapBindingStyle等于rpc来标记。 (如果为使用文档样式绑定的方法指定此关键字,则WSDL将不会是自一致的。)

默认

如果忽略此关键字,则该方法位于web服务或客户端类的namespace参数指定的名称空间中。

WSDL的关系

对于InterSystems IRIS web服务服务,SoapNameSpace关键字影响<definitions>元素中的名称空间声明。 这里添加了指定的名称空间(例如http://www.customtypes.org)。 例如:

代码语言:javascript复制
...
xmlns:ns2="http://www.customtypes.org" 
xmlns:s0="http://www.wsns.org" 
...
targetNamespace="http://www.wsns.org"

在本例中,http://www.customtypes.org名称空间被分配给前缀ns2

请注意,WSDL通常还声明了web服务的名称空间(http://www.wsns.org)。 在本例中,该名称空间被分配给前缀s0,并且也用作目标名称空间。

对SOAP消息的影响

一个可能的SOAP消息可能如下所示(为了可读性添加了换行符和空格):

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' 
                   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
                   xmlns:s='http://www.w3.org/2001/XMLSchema' 
                   xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' 
                   xmlns:tns='http://www.customtypes.org' >
   <SOAP-ENV:Body SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>
      <tns:AddResponse>
         <AddResult>42</AddResult>
      </tns:AddResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

注意,<addressponse>元素位于http://www.webservicetypesns.org名称空间中。

相反,如果我们没有指定SoapNameSpace关键字,则消息将如下所示:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' 
                   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
                   xmlns:s='http://www.w3.org/2001/XMLSchema' 
                   xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' 
                   xmlns:tns='http://www.wsns.org' >
   <SOAP-ENV:Body SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>
      <tns:AddResponse>
         <AddResult>42</AddResult>
      </tns:AddResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

在本例中,<addressponse>元素位于web服务的名称空间http://www.wsns.org中。

0 人点赞