SOAP消息和WSDL之间的区别?
我对SOAP消息和WSDL如何组合在一起感到困惑? 我已经开始研究SOAP消息,例如:
POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
所有的SOAP消息都是WSDL的吗? SOAP是接受自己的“SOAP消息”还是“WSDL”的协议? 如果它们不同,那么什么时候应该使用SOAP消息,什么时候应该使用WSDL?
一些关于这个的澄清将是真棒。
每个请求都会发送一个SOAP文档。 假设我们是一家书店,并且有一台我们查询的远程服务器来了解某本书的当前价格。 假设我们需要将图书的标题,页数和ISBN号码传递给服务器。
无论何时我们想知道价格,我们都会发送一个唯一的SOAP消息。 它会看起来像这样;
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:GetBookPrice xmlns:m="http://namespaces.my-example-book-info.com"> <ISBN>978-0451524935</ISBN> <Title>1984</Title> <NumPages>328</NumPages> </m:GetBookPrice> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
我们希望得到一个SOAP响应消息,如:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:GetBookPriceResponse xmlns:m="http://namespaces.my-example-book-info.com"> <CurrentPrice>8.99</CurrentPrice> <Currency>USD</Currency> </m:GetBookPriceResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
然后WSDL描述了当服务器接收到这个消息时如何处理/处理这个消息。 在我们的例子中,它描述了Title,NumPages和ISBN是什么types,我们是否应该期待GetBookPrice消息的响应,以及响应应该是什么样的。
types看起来像这样;
<wsdl:types> <!-- all type declarations are in a chunk of xsd --> <xsd:schema targetNamespace="http://namespaces.my-example-book-info.com" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <xsd:element name="GetBookPrice"> <xsd:complexType> <xsd:sequence> <xsd:element name="ISBN" type="string"/> <xsd:element name="Title" type="string"/> <xsd:element name="NumPages" type="integer"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="GetBookPriceResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="CurrentPrice" type="decimal" /> <xsd:element name="Currency" type="string" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types>
但是,WSDL还包含更多的信息,关于哪些function链接在一起进行操作,哪些操作在服务中可用,以及在networking中哪里可以访问服务/操作。
另请参阅W3注释的WSDL示例
SOAP消息是用于传输数据的XML文档。 WSDL是一个XML文档,它描述了如何连接并向Web服务发出请求。
基本上,SOAP消息是您传输的数据,WSDL告诉您可以做什么以及如何进行调用。
在谷歌快速search将产生额外的阅读许多来源(以前的书链接现在已经死了,打击这将提出任何新的build议在意见)
只是注意到你的具体问题:
所有的SOAP消息都是WSDL的吗? 不,他们根本不是一回事。
SOAP是接受自己的“SOAP消息”还是“WSDL”的协议? 没有 – 阅读需要,因为这是遥远的。
如果它们不同,那么什么时候应该使用SOAP消息,什么时候应该使用WSDL? 肥皂是适用于您的消息/数据传输的结构。 WSDLs仅用于确定如何打电话到服务摆在首位。 当您第一次添加代码来调用特定的Web服务时,通常这是一次性的事情。
WSDL(Web服务定义语言)是描述Web服务的元数据文件。
像操作名称,参数等
肥皂消息是实际的有效载荷
我们需要定义什么是Web服务,然后告诉SOAP和WSDL之间的区别,其中两个(SOAP和WSDL)是Web服务的组件
大多数应用程序都是为了与用户交互而开发的,用户通过接口input或search数据,然后应用程序响应用户的input。
除了Web服务应用程序只能从机器到机器或从应用程序到应用程序的通信之外,Web服务或多或less地具有相同的function。 通常没有直接的用户交互。
Web服务基本上是用于在应用程序之间交换数据的开放协议的集合。 开放协议的使用使得Web服务可以独立于平台。 用不同的编程语言编写的软件可以在不同的平台上运行,可以使用Web服务通过计算机networking(如Internet)交换数据。 换句话说,Windows应用程序可以与PHP,Java和Perl应用程序以及许多其他应用程序交谈,这在正常情况下是不可能的。
Web服务如何工作?
由于不同的应用程序是用不同的编程语言编写的,它们往往不能相互通信。 Web服务通过使用开放协议和标准(主要是XML,SOAP和WSDL)的组合来实现这种通信。 Web服务使用XML来标记数据,使用SOAP来传输消息,最后使用WSDL来描述服务的可用性。 我们来看看Web服务应用程序的这三个主要组件。
简单对象访问协议(SOAP)
简单对象访问协议或SOAP是用于在应用程序之间发送和接收消息而不会遇到互操作性问题(互操作性,即Web服务运行的平台变得无关紧要)的协议。 具有类似function的另一种协议是HTTP。 它用于访问网页或上网。 HTTP确保您不必担心什么样的Web服务器(无论是Apache还是IIS或其他)为您提供正在查看的页面,或者您查看的页面是以ASP.NET还是HTML创build的。
由于SOAP既用于请求也用于响应,其内容根据其用途而略有不同。
下面是一个SOAP请求和响应消息的例子
SOAP请求:
POST /InStock HTTP/1.1 Host: www.bookshop.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.bookshop.org/prices"> <m:GetBookPrice> <m:BookName>The Fleamarket</m:BookName> </m:GetBookPrice> </soap:Body> </soap:Envelope>
SOAP响应:
POST /InStock HTTP/1.1 Host: www.bookshop.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.bookshop.org/prices"> <m:GetBookPriceResponse> <m: Price>10.95</m: Price> </m:GetBookPriceResponse> </soap:Body> </soap:Envelope>
虽然这两个消息看起来都是一样的,但他们采取了不同的方法 例如,看上面的例子,你可以看到请求消息使用GetBookPrice
方法来获取图书价格。 响应由GetBookPriceResponse
方法执行,这将成为您作为“请求者”将看到的消息。 您还可以看到消息是使用XML编写的。
Web服务描述语言或WSDL
WSDL是一个描述Web服务的文档,也告诉你如何访问和使用它的方法。
WSDL负责你如何知道在互联网上偶然发现的Web服务中可用的方法。
看一下示例WSDL文件:
<?xml version="1.0" encoding="UTF-8"?> <definitions name ="DayOfWeek" targetNamespace="http://www.roguewave.com/soapworx/examples/DayOfWeek.wsdl" xmlns:tns="http://www.roguewave.com/soapworx/examples/DayOfWeek.wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/"> <message name="DayOfWeekInput"> <part name="date" type="xsd:date"/> </message> <message name="DayOfWeekResponse"> <part name="dayOfWeek" type="xsd:string"/> </message> <portType name="DayOfWeekPortType"> <operation name="GetDayOfWeek"> <input message="tns:DayOfWeekInput"/> <output message="tns:DayOfWeekResponse"/> </operation> </portType> <binding name="DayOfWeekBinding" type="tns:DayOfWeekPortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="GetDayOfWeek"> <soap:operation soapAction="getdayofweek"/> <input> <soap:body use="encoded" namespace="http://www.roguewave.com/soapworx/examples" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body use="encoded" namespace="http://www.roguewave.com/soapworx/examples" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> </binding> <service name="DayOfWeekService" > <documentation> Returns the day-of-week name for a given date </documentation> <port name="DayOfWeekPort" binding="tns:DayOfWeekBinding"> <soap:address location="http://localhost:8090/dayofweek/DayOfWeek"/> </port> </service> </definitions>
关于WSDL文件的主要内容是它提供了:
比电话更好的比喻:通过邮购服务订购产品。 WSDL文档就像说明如何创build服务提供者接受的订单表单一样。 SOAP消息就像一个标准devise(大小,形状,结构)的信封,世界各地的邮局都知道如何处理。 你把你的订单放进这个信封里。 networking(如互联网)是邮政服务。 你把信封放进邮件里 邮政部门的员工不在信封里面看。 有效载荷XML是您在信封中包含的订单表单。 邮局递交信封后,networking服务提供商打开信封并处理订单。 如果您已经正确创build并填写了表单,他们会将您订购的产品邮寄给您。
简单来说,如果你有一个计算器的networking服务。 WSDL讲述了您可以实现或向客户端公开的function。 例如:添加,删除,减去等。 在使用SOAP时,您实际上执行的操作如doDelete(),doSubtract(),doAdd()。 所以SOAP和WSDL是苹果和桔子。 我们不应该比较它们。 他们都有自己的不同function。
SOAP:这是一个开放标准的基于XML的通信协议,用于将信息从用户交换到Web服务,反之亦然。 肥皂只是以某种方式组织数据的文档。 对于每个请求和回应,单独的肥皂可能会出现。
WSDL:在soap中,数据以某种方式组织,这个组织在WSDL中指定,这里也指定了必须使用的数据types。 对于请求和响应,单个WSDL将出现
我们可以考虑一个电话在这个数字是wsdl和信息交换是肥皂。
WSDL描述如何与通信服务器连接.SOAP有通信消息。