在说明 SOAP 和 WSDL 之间有什么区别之前,我们需要定义什么是 Web 服务,其中两者(SOAP 和 WSDL)是 Web 服务的组件
大多数应用程序都是为了与用户交互而开发的,用户通过界面输入或搜索数据,然后应用程序响应用户的输入。
除了 Web 服务应用程序仅在机器与机器之间或应用程序与应用程序之间进行通信之外,Web 服务或多或少地做同样的事情。通常没有直接的用户交互。
Web 服务基本上是一组开放协议,用于在应用程序之间交换数据。开放协议的使用使 Web 服务能够独立于平台。用不同编程语言编写并在不同平台上运行的软件可以使用 Web 服务通过计算机网络(如 Internet)交换数据。换句话说,Windows 应用程序可以与 PHP、Java 和 Perl 应用程序以及许多其他应用程序通信,这在正常情况下是不可能的。
Web 服务如何工作?
因为不同的应用程序是用不同的编程语言编写的,所以它们经常无法相互通信。Web 服务通过使用开放协议和标准(主要是 XML、SOAP 和 WSDL)的组合来实现这种通信。Web 服务使用 XML 标记数据,使用 SOAP 传输消息,最后使用 WSDL 来描述服务的可用性。让我们看一下 Web 服务应用程序的这三个主要组件。
简单对象访问协议 (SOAP)
简单对象访问协议或 SOAP 是一种用于在应用程序之间发送和接收消息而不会遇到互操作性问题的协议(互操作性意味着运行 Web 服务的平台变得无关紧要)。另一个具有类似功能的协议是 HTTP。它用于访问网页或上网。HTTP 确保您不必担心哪种 Web 服务器(Apache 或 IIS 或任何其他)为您提供正在查看的页面,或者您查看的页面是用 ASP.NET 还是 HTML 创建的。
因为 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>
肥皂响应:
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 负责您如何知道您在 Internet 上偶然发现的 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 文件要记住的主要事项是它为您提供:
Web 服务的描述
Web 服务使用的方法和它采用的参数
一种定位 Web 服务的方法