📜  SOAP-快速指南

📅  最后修改于: 2020-12-13 14:40:27             🧑  作者: Mango


SOAP是简单对象访问协议的缩写。它是一种基于XML的消息传递协议,用于在计算机之间交换信息。 SOAP是XML规范的应用程序。

注意事项

  • SOAP是一种旨在通过Internet进行通信的通信协议。

  • SOAP可以扩展HTTP以进行XML消息传递。

  • SOAP为Web服务提供数据传输。

  • SOAP可以交换完整的文档或调用远程过程。

  • SOAP可用于广播消息。

  • SOAP与平台和语言无关。

  • SOAP是定义发送什么信息以及如何发送信息的XML方式。

  • SOAP使客户端应用程序可以轻松连接到远程服务并调用远程方法。

尽管SOAP可以用于各种消息传递系统中,并且可以通过各种传输协议进行传递,但是SOAP的最初重点是通过HTTP传输的远程过程调用。

包括CORBA,DCOM和Java RMI在内的其他框架提供了与SOAP类似的功能,但是SOAP消息完全以XML编写,因此具有唯一的平台和语言独立性。

SOAP-消息结构

SOAP消息是包含以下元素的普通XML文档-

  • 信封-定义消息的开始和结束。这是必不可少的元素。

  • 标头-包含在中介点或最终端点处用于处理消息的消息的任何可选属性。它是一个可选元素。

  • -包含被发送包括消息中的XML数据。这是必不可少的元素。

  • 故障-可选的故障元素,提供有关在处理消息时发生的错误的信息。

所有这些因素都在SOAP信封的默认命名空间中声明- http://www.w3.org/2001/12/soap-envelope和SOAP编码和数据类型的默认命名空间是- HTTP://www.w3 .org / 2001/12 / soap-encoding

–所有这些规格均可能更改。因此,请继续使用W3网站上可用的最新规范进行更新。

SOAP消息结构

以下块描述了SOAP消息的一般结构-




   
... ...
... ... ... ... ...

SOAP-信封

SOAP信封指示消息的开始和结束,以便接收者知道何时已接收到整个消息。 SOAP信封解决了知道何时完成接收消息并准备对其进行处理的问题。因此,SOAP信封基本上是一种包装机制。

注意事项

  • 每个SOAP消息都有一个根信封元素。

  • 信封是SOAP消息的必需部分。

  • 每个Envelope元素必须只包含一个Body元素。

  • 如果一个信封包含一个Header元素,则它最多只能包含一个,并且它必须作为信封的第一个子元素出现在“正文”之前。

  • SOAP版本更改时,信封也会更改。

  • 使用ENV名称空间前缀和Envelope元素指定SOAP信封。

  • 还使用名称空间名称和可选的encodingStyle元素来指定可选的SOAP编码,这也可以指向除SOAP之外的一种编码样式。

  • 兼容v1.1的SOAP处理器在收到包含v1.2信封命名空间的消息时会生成错误。

  • 如果兼容v1.2的SOAP处理器收到不包含v1.2信封命名空间的消息,则会生成VersionMismatch错误。

符合v1.2的SOAP消息

下面给出的是兼容v1.2的SOAP消息的示例。



   ...
   Message information goes here
   ...

带有HTTP POST的SOAP

以下示例说明了HTTP POST操作中SOAP消息的使用,该操作将消息发送到服务器。它显示了信封模式定义和编码规则的模式定义的名称空间。 HTTP标头中的OrderEntry引用是在tutorialspoint.com网站上要调用的程序的名称。

POST /OrderEntry HTTP/1.1
Host: www.tutorialspoint.com
Content-Type: application/soap; charset = "utf-8"
Content-Length: nnnn



   ...
   Message information goes here
   ...

– HTTP绑定指定服务的位置。

SOAP-标头

可选的Header元素提供了一个灵活的框架,用于指定其他应用程序级别的要求。例如,Header元素可用于为受密码保护的服务指定数字签名。同样,它可以用于指定按使用付费SOAP服务的帐号。

注意事项

  • 它是SOAP消息的可选部分。

  • 标头元素可以出现多次。

  • 标头旨在添加新的功能。

  • SOAP标头包含在名称空间中定义的标头条目。

  • 标头被编码为SOAP信封的第一个直接子元素。

  • 当定义了多个标头时,SOAP标头的所有直接子元素都被解释为SOAP标头块。

SOAP标头属性

SOAP标头可以具有以下两个属性-

演员属性

SOAP协议将消息路径定义为SOAP服务节点列表。这些中间节点中的每一个都可以执行一些处理,然后将消息转发到链中的下一个节点。通过设置Actor属性,客户端可以指定SOAP标头的接收者。

MustUnderstand属性

它指示Header元素是可选的还是必需的。如果设置为true,则接收者必须根据其定义的语义理解并处理Header属性,否则将返回错误。

以下示例显示了如何在SOAP消息中使用Header。




   
5
... ...

香皂-身体

SOAP主体是必选元素,其中包含在SOAP消息中交换的应用程序定义的XML数据。正文必须包含在信封中,并且必须遵循可能为邮件定义的所有标题。

主体被定义为信封的子元素,并且主体的语义在关联的SOAP模式中定义。

正文包含旨在最终接收消息的强制性信息。例如-



   ........
   
      
         Computers
      
   

上面的示例要求报价计算机集。请注意,上面的m:GetQuotation和Item元素是特定于应用程序的元素。它们不是SOAP标准的一部分。

这是对上述查询的响应-



   ........
   
      
         This is Qutation
      
   

通常,应用程序还定义一个架构,以包含与请求和响应元素关联的语义。

可以使用在应用程序服务器中运行的EJB来实现报价服务。如果是这样,则SOAP处理器将负责将主体信息作为参数映射到GetQuotationResponse服务的EJB实现中以及从其中实现。 SOAP处理器还可以将主体信息映射到.NET对象,CORBA对象,COBOL程序等。

SOAP-故障

如果在处理过程中发生错误,则对SOAP消息的响应是消息正文中的SOAP故障元素,并且该故障将返回给SOAP消息的发送者。

SOAP故障机制返回有关错误的特定信息,包括预定义的代码,描述和产生故障的SOAP处理器的地址。

注意事项

  • SOAP消息只能携带一个故障块。

  • 故障是SOAP消息的可选部分。

  • 对于HTTP绑定,成功的响应将链接到200到299范围的状态码。

  • SOAP Fault链接到状态代码的500到599范围。

故障的子元素

SOAP Fault具有以下子元素-

Sr.No Sub-element & Description
1

It is a text code used to indicate a class of errors. See the next Table for a listing of predefined fault codes.

2

It is a text message explaining the error.

3

It is a text string indicating who caused the fault. It is useful if the SOAP message travels through several nodes in the SOAP message path, and the client needs to know which node caused the error. A node that does not act as the ultimate destination must include a faultActor element.

4

It is an element used to carry application-specific error messages. The detail element can contain child elements called detail entries.

SOAP故障代码

描述故障时,必须在faultcode元素中使用下面定义的faultCode值。

Sr.No Error & Description
1

SOAP-ENV:VersionMismatch

Found an invalid namespace for the SOAP Envelope element.

2

SOAP-ENV:MustUnderstand

An immediate child element of the Header element, with the mustUnderstand attribute set to “1”, was not understood.

3

SOAP-ENV:Client

The message was incorrectly formed or contained incorrect information.

4

SOAP-ENV:Server

There was a problem with the server, so the message could not proceed.

SOAP故障示例

以下代码是故障示例。客户端请求了一个名为ValidateCreditCard的方法,但该服务不支持这种方法。这代表客户端请求错误,并且服务器返回以下SOAP响应-




   
      
         SOAP-ENV:Client
         
            Failed to locate method (ValidateCreditCard) in class (examplesCreditCard) at
               /usr/local/ActivePerl-5.6/lib/site_perl/5.6.0/SOAP/Lite.pm line 1555.
         
      
   

SOAP-编码

SOAP包含一组用于编码数据类型的内置规则。它使SOAP消息能够指示特定的数据类型,例如整数,浮点数,双精度数或数组。

  • SOAP数据类型分为两大类-标量类型和复合类型。

  • 标量类型仅包含一个值,例如姓氏,价格或产品描述。

  • 复合类型包含多个值,例如采购订单或股票报价列表。

  • 化合物类型进一步细分为数组和结构。

  • SOAP消息的编码样式是通过SOAP-ENV:encodingStyle属性设置的。

  • 要使用SOAP 1.1编码,请使用值http://schemas.xmlsoap.org/soap/encoding/

  • 要使用SOAP 1.2编码,请使用值http://www.w3.org/2001/12/soap-encoding

  • 最新的SOAP规范采用了XML Schema定义的所有内置类型。 SOAP仍然保留自己的约定,用于定义XML Schema尚未标准化的结构,例如数组和引用。

标量类型

对于标量类型,SOAP采用XML Schema规范指定的所有内置简单类型。这包括字符串,浮点数,双精度数和整数。

下表列出了主要的简单类型,摘录自XML Schema Part 0-入门http://www.w3.org/TR/2000/WD-xmlschema-0-20000407/

Simple Types Built-In to XML Schema
Simple Type Example(s)
string Confirm this is electric.
boolean true, false, 1, 0.
float -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN.
double -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN.
decimal -1.23, 0, 123.4, 1000.00.
binary 100010
integer -126789, -1, 0, 1, 126789.
nonPositiveInteger -126789, -1, 0.
negativeInteger -126789, -1.
long -1, 12678967543233
int -1, 126789675
short -1, 12678
byte -1, 126
nonNegativeInteger 0, 1, 126789
unsignedLong 0, 12678967543233
unsignedInt 0, 1267896754
unsignedShort 0, 12678
unsignedByte 0, 126
positiveInteger 1, 126789.
date 1999-05-31, —05.
time 13:20:00.000, 13:20:00.000-05:00

例如,这是具有双重数据类型的SOAP响应-



   
   
      
         54.99
      
   

复合类型

SOAP数组具有一组非常特定的规则,要求您同时指定元素类型和数组大小。 SOAP还支持多维数组,但并非所有SOAP实现都支持多维功能。

要创建数组,必须将其指定为数组的xsi:type 。数组还必须包含arrayType属性。需要此属性来指定所包含元素的数据类型和数组的维。

例如,以下属性指定10个double值的数组-

arrayType = "xsd:double[10]"

相比之下,以下属性指定字符串的二维数组-

arrayType = "xsd:string[5,5]"

这是带有双精度值数组的示例SOAP响应-




   
      

         
            54.99
            19.99
         
      
   

结构包含多个值,但是每个元素都使用唯一的访问器元素指定。例如,考虑产品目录中的项目。在这种情况下,结构可能包含产品SKU,产品名称,描述和价格。这是在SOAP消息中表示这种结构的方式-




   
      
        
         
            Red Hat Linux
            54.99
            
               Red Hat Linux Operating System
            
            A358185
         
      
   

注意-在编写SOAP代码时,请注意适当的缩进。结构中的每个元素都使用唯一的访问者名称指定。例如,上面的消息包括四个访问器元素-名称,价格,描述和SKU。每个元素可以具有自己的数据类型。例如,name指定为字符串,而price指定为double。

SOAP-运输

SOAP不与任何传输协议绑定。 SOAP可以通过SMTP,FTP,IBM的MQSeries或Microsoft消息队列(MSMQ)进行传输。

SOAP规范仅包含有关HTTP的详细信息。 HTTP仍然是最流行的SOAP传输协议。

通过HTTP的SOAP

从逻辑上讲,SOAP请求是通过HTTP请求发送的,并且SOAP响应是在HTTP响应的内容内返回的。尽管可以通过HTTP GET发送SOAP请求,但该规范仅包含有关HTTP POST的详细信息。

此外,HTTP请求和响应都需要将其内容类型设置为text / xml。

SOAP规范要求客户端必须提供SOAPAction标头,但是SOAPAction标头的实际值取决于SOAP服务器的实现。

例如,要访问XMethods托管的AltaVista BabelFish转换服务,必须将以下内容指定为SOAPAction标头。

urn:xmethodsBabelFish#BabelFish

即使服务器不需要完整的SOAPAction标头,客户端也必须指定一个空字符串(“”)或一个空值。例如-

SOAPAction: ""
SOAPAction:

这是通过HTTP发送到XMethods Babelfish Translation Service的示例请求-

POST /perl/soaplite.cgi HTTP/1.0
Host: services.xmethods.com
Content-Type: text/xml; charset = utf-8
Content-Length: 538
SOAPAction: "urn:xmethodsBabelFish#BabelFish"




   
      
         en_fr
         Hello, world!
      
   

注意内容类型和SOAPAction标头。另请注意,BabelFish方法需要两个String参数。转换模式en_fr从英语转换为法语。

这是来自XMethods的响应-

HTTP/1.1 200 OK
Date: Sat, 09 Jun 2001 15:01:55 GMT
Server: Apache/1.3.14 (Unix) tomcat/1.0 PHP/4.0.1pl2
SOAPServer: SOAP::Lite/Perl/0.50
Cache-Control: s-maxage = 60, proxy-revalidate
Content-Length: 539
Content-Type: text/xml



   
   
      
         Bonjour, monde!
      
   

通过HTTP传递的SOAP响应必须遵循相同的HTTP状态代码。例如,状态码200 OK表示响应成功。状态代码500 Internal Server Error表示存在服务器错误,并且SOAP响应包括Fault元素。

SOAP-示例

在下面的示例中, GetQuotation请求通过HTTP发送到SOAP服务器。该请求具有QuotationName参数,并且将在响应中返回Quotation。

该函数的名称空间在http://www.xyz.org/quotation地址中定义。

这是SOAP请求-

POST /Quotation HTTP/1.0
Host: www.xyz.org
Content-Type: text/xml; charset = utf-8
Content-Length: nnn




   
      
         MiscroSoft
      
   

相应的SOAP响应如下所示:

HTTP/1.0 200 OK
Content-Type: text/xml; charset = utf-8
Content-Length: nnn




   
      
         Here is the quotation
      
   

SOAP-标准

SOAP 1.1最初于2000年5月提交给W3C。官方提交者包括Microsoft,IBM和Ariba等大型公司,以及UserLand Software和DevelopMentor等小型公司。

2001年7月,XML协议工作组发布了SOAP 1.2的“工作草案”。在W3C中,该文档正式上是一个正在进行的工作,这意味着该文档在定稿之前可能会多次更新。

SOAP版本1.1可以在线获得,网址http://www.w3.org/TR/SOAP/

SOAP 1.2版的工作草案可从http://www.w3.org/TR/soap12/获得

请注意,W3C还托管了“带有附件的SOAP消息”的提交,该提交与核心SOAP规范是分开的。该规范使SOAP消息能够包含二进制附件,例如图像和声音文件。有关完整的详细信息,请参见http://www.w3.org/TR/SOAP-attachments上的W3C注释。