📄 soap协议规范.htm
字号:
<BR><phoneNumber>1-888-123-4567</phoneNumber>
<BR></phoneNumbers> <BR></xyz:Person></P></BLOCKQUOTE>
<P>下面的例子中,数组值为single-reference,被编码为嵌入元素,包含它的元素名即为入口名:</P>
<BLOCKQUOTE>
<P><xyz:PurchaseOrder> <BR><CustomerName>Henry
Ford</CustomerName> <BR><ShipTo> <BR><Street>5th
Ave</Street> <BR><City>New York</City>
<BR><State>NY</State> <BR><Zip>10010</Zip>
<BR></ShipTo> <BR><PurchaseLineItems
SOAP-ENC:arrayType="Order[2]"> <BR><Order>
<BR><Product>Apple</Product>
<BR><Price>1.56</Price> <BR></Order> <BR><Order>
<BR><Product>Peach</Product>
<BR><Price>1.48</Price> <BR></Order>
<BR></PurchaseLineItems>
<BR></xyz:PurchaseOrder></P></BLOCKQUOTE>
<H4>5.4.2.1 部分储值(partially transmitted)数组</H4>
<P>SOAP提供了对部分储值(partially transmitted)数组的支持,如某些上下文中的可变数组。一个partially
transmitted
数组由一个"SOAP-ENC:offset"属性(从第一个transmitted的元素开始的偏移量,基于0)指示。如果省略,偏移量取0。下面的例子中数组的大小为5,但只有从0起,第三和第四个元素被储值。</P>
<BLOCKQUOTE>
<P><SOAP-ENC:Array ;SOAP-ENC:arrayType="xsd:string[5]"
;SOAP-ENC:offset="[2]"> <BR><item>The third
element</item> <BR><item>The fourth element</item>
<BR></SOAP-ENC:Array></P></BLOCKQUOTE>
<H4>5.4.2.2 稀疏数组Sparse Arrays</H4>
<P>SOAP提供了对稀疏数组的支持。每个表示成员值的元素包含一个"SOAP-ENC:position"属性,用来指示它在数组中的位置。下例是两维字符串稀疏数组的例子,数组大小是4,但只用到第2个。</P>
<BLOCKQUOTE>
<P><SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[,][4]">
<BR><SOAP-ENC:Array href="#array-1" SOAP-ENC:position="[2]"/>
<BR></SOAP-ENC:Array> <BR><SOAP-ENC:Array id="array-1"
SOAP-ENC:arrayType="xsd:string[10,10]"> <BR><item
SOAP-ENC:position="[2,2]">Third row, third col</item>
<BR><item SOAP-ENC:position="[7,2]">Eighth row, third
col</item> <BR></SOAP-ENC:Array></P></BLOCKQUOTE>
<P>如果对array-1的引用仅发生在数组内部,上例也可以编码如下:</P>
<BLOCKQUOTE>
<P><SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[,][4]">
<BR><SOAP-ENC:Array SOAP-ENC:position="[2]"
SOAP-ENC:arrayType="xsd:string[10, 10]> <BR><item
SOAP-ENC:position="[2,2]">Third row, third col</item>
<BR><item SOAP-ENC:position="[7,2]">Eighth row, third
col</item> <BR></SOAP-ENC:Array>
<BR></SOAP-ENC:Array></P></BLOCKQUOTE>
<H4>5.4.3 一般复合类型</H4>
<P>在这里提到的编码规则不仅仅限于accessor名已知的情况,如果accessor名是运行环境下实时获得的,编码规则同样适用,也就是说accessor编码成一个元素名与accessor名匹配的元素,同时accessor可能包含或者引用该元素的值。如果accessor包含类型不能事先确定的值,它必须包含一个合适的属性xsi:type
。类似地,上述引用的规则已经足够用于复合类型的序列化,这些复合类型可能包含用名区分的accessors(结构)和用名及序数位置区分的accessors。(可能包含重复的accessor)
实际上这并不要求任何schema模式包含这些类型,但更为准确的说法是:一个类型模型(type-model)schema如果有这些类型,就可以构造一个符合XML句法规则的schema和XML文档实例。</P>
<BLOCKQUOTE>
<P><xyz:PurchaseOrder> <BR><CustomerName>Henry
Ford</CustomerName> <BR><ShipTo> <BR><Street>5th
Ave</Street> <BR><City>New York</City>
<BR><State>NY</State> <BR><Zip>10010</Zip>
<BR></ShipTo> <BR><PurchaseLineItems> <BR><Order>
<BR><Product>Apple</Product>
<BR><Price>1.56</Price> <BR></Order> <BR><Order>
<BR><Product>Peach</Product>
<BR><Price>1.48</Price> <BR></Order>
<BR></PurchaseLineItems>
<BR></xyz:PurchaseOrder></P></BLOCKQUOTE>
<P>类似地,将一个结构上类似数组但实际上不是一个 SOAP-ENC:Array类型或者
SOAP-ENC:Array子类型的复合值序列化同样是允许的,例如:</P>
<BLOCKQUOTE>
<P><PurchaseLineItems> <BR><Order>
<BR><Product>Apple</Product>
<BR><Price>1.56</Price> <BR></Order> <BR><Order>
<BR><Product>Peach</Product>
<BR><Price>1.48</Price> <BR></Order>
<BR></PurchaseLineItems></P></BLOCKQUOTE>
<H4>5.5 缺省值</H4>
<P>省略accessor元素意味着或者有一个缺省值或者值不知道。具体细节依靠这个accessor,方法和上下文。例如,对于多态accessor,省略accessor一般意味着一个Null值。同样,省略布尔accessor一般意味着False值或者值不知道,省略数字accessor一般意味着值为零或者值不知道。</P>
<H4>5.6 SOAP root属性</H4>
<P>SOAP root
属性可用于标记一个序列化root,从而一个对象可以反序列化(deserialized),而实际上该root并不是真正的对象root。这个属性有两个可选值"1"
or "0"。对象真正的roots属性值为“1”
,序列化root但不是真正的root属性值也为“1”,元素如果要显式地指定不能为序列化root,只需将该属性设置为“0” SOAP
root属性可以出现在SOAP头和SOAP体元素的任意子元素中。(译者注:SOAP
root属性为0的元素不是一个独立的实体,外部的应用不能访问到该元素,但该元素可以被SOAP文档本身的其它元素访问到)SOAP
root属性可以出现在SOAP头和SOAP体元素的任意子元素中。这个属性没有缺省值。</P>
<H4>6. 在HTTP中使用SOAP</H4>
<P>这一节讲述了如何在HTTP中使用SOAP。把SOAP绑定到HTTP,无论使用或不用HTTP扩展框架,都有很大的好处:在利用SOAP的形式化和灵活性的同时,使用HTTP种种丰富的特性。在HTTP中携带SOAP消息,并不意味着SOAP改写了HTTP已有的语义,而是将构建在HTTP之上SOAP语义自然地对应到HTTP语义。SOAP自然地遵循HTTP的请求/应答消息模型使得SOAP的请求和应答参数可以包含在HTTP请求和应答中。注意,SOAP的中间节点与HTTP的中间节点并不等同,即,不要期望一个根据HTTP连接头中的域寻址到的HTTP中间节点能够检查或处理HTTP请求中的SOAP消息。
<BR>在HTTP消息中包含SOAP实体时,按照RFC2376[3] HTTP应用程序必须使用媒体类型 "text/xml"。</P>
<H4>6.1 SOAP HTTP请求</H4>
<P>虽然SOAP可能与各种HTTP请求方式相结合,但是绑定仅定义了在HTTP
POST请求中包含SOAP消息。(第7节中描述了如何在RPC中使用SOAP,第6.3节描述了如何使用HTTP扩展框架)</P>
<H4>6.1.1 HTTP头中SOAPAction域</H4>
<P>一个HTTP请求头中的SOAPAction域用来指出这是一个SOAP
HTTP请求,它的值是所要的URI。在格式、URI的特性和可解析性上没有任何限制。当HTTP客户发出SOAP
HTTP请求时必须使用在HTTP头中使用这个域。</P>
<P>soapaction = "SOAPAction" ":" [ <"> URI-reference <"> ]
<BR>URI-reference = <as defined in RFC 2396 [4]></P>
<P>HTTP头中SOAPAction域使服务器(如防火墙)能正确的过滤HTTP中SOAP请求消息。如果这个域的值是空字符串(""),表示SOAP消息的目标就是HTTP请求的URI。这个域没有值表示没有SOAP消息的目标的信息。例子:</P>
<BLOCKQUOTE>
<P>SOAPAction: "http://electrocommerce.org/abc#MyMessage"
<BR>SOAPAction: "myapp.sdl" <BR>SOAPAction: ""
<BR>SOAPAction:</P></BLOCKQUOTE>
<H4>6.2 SOAP HTTP应答</H4>
<P>SOAP HTTP遵循HTTP
中表示通信状态信息的HTTP状态码的语义。例如,2xx状态码表示这个包含了SOAP组件的客户请求已经被成功的收到,理解和接受。在处理请求时如果发生错误,SOAP
HTTP服务器必须发出应答HTTP 500 "Internal Server Error",并在这个应答中包含一个SOAP
Fault元素(见4.4节)表示这个SOAP处理错误。</P>
<H4>6.3 HTTP扩展框架</H4>
<P>一个SOAP消息可以与HTTP扩展框架 [6]一起使用以区分是否有SOAP
HTTP请求和它的目标。是使用扩展框架或是普通的HTTP关系到通信各方的策略和能力。通过使用一个必需的扩展声明和"M-"HTTP方法名前缀,客户可以强制使用HTTP扩展框架。服务器可以使用HTTP状态码510
"Not
Extended"强制使用HTTP扩展框架。也就是说,使用一个额外的来回,任何一方都可以发现另一方的策略并依照执行。用来表示SOAP使用了扩展框架的扩展标志符是:http://schemas.xmlsoap.org/soap/envelope/</P>
<H4>6.4 SOAP HTTP举例</H4>
<P>例3 使用POST的SOAP HTTP</P>
<BLOCKQUOTE>
<P>POST /StockQuote HTTP/1.1 <BR>Content-Type: text/xml; charset="utf-8"
<BR>Content-Length: nnnn <BR>SOAPAction:
"http://electrocommerce.org/abc#MyMessage" <BR><SOAP-ENV:Envelope...
<BR>HTTP/1.1 200 OK <BR>Content-Type: text/xml; charset="utf-8"
<BR>Content-Length: nnnn <BR><SOAP-ENV:Envelope... </P></BLOCKQUOTE>
<P>例4 使用扩展框架的SOAP HTTP</P>
<BLOCKQUOTE>
<P>M-POST /StockQuote HTTP/1.1 <BR>Man:
"http://schemas.xmlsoap.org/soap/envelope/"; ns=NNNN <BR>Content-Type:
text/xml; charset="utf-8" <BR>Content-Length: nnnn <BR>NNNN-SOAPAction:
"http://electrocommerce.org/abc#MyMessage" <BR><SOAP-ENV:Envelope...
<BR>HTTP/1.1 200 OK <BR><BR>Ext: <BR>Content-Type: text/xml;
charset="utf-8" <BR>Content-Length: nnnn
<BR><SOAP-ENV:Envelope...</P></BLOCKQUOTE>
<H4>7. 在RPC中使用SOAP</H4>
<P>设计SOAP的目的之一就是利用XML的扩展性和灵活性来封装和交换RPC调用。这一节定义了远程过程调用和应答的统一表示形式。虽然可以预计到这种表示形式最可能被用于与第5节中定义的编码方式相结合,但也可能有其它的表示形式。SOAP的encodingStyle属性(见4.3.2节)可以用来表明方法调用和应答都使用这一节所指定的表示方式。在RPC中使用SOAP和SOAP协议绑定(见第6节)是紧密相关的。在使用HTTP作为绑定协议时,一个RPC调用自然地映射到一个HTTP请求,RPC应答同样映射到HTTP应答。但是,在RPC中
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -