在告诉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>
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负责您如何知道在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服务的方法