(一)Web服务(Web Services)原理
一个 实时的股票报价的Web服务
在讲Web服务之前,先看一个实时的股票报价的Web服务。
http://www.webservicex.net/stockquote.asmx?op=GetQuote
在symbol栏中输入中国工商银行的股票代码“601988.SS”(中国沪市的后缀是SS, 比如中国银行601988.SS,深市后缀是SZ, 比如万科A是000002.SZ)。
得到的结果是XML格式的文档。
<?
xml version="1.0" encoding="utf-8"
?>
<
string
xmlns
="http://www.webserviceX.NET/"
>
<
StockQuotes
>
<
Stock
>
<
Symbol
>
601988.SS
</
Symbol
>
<
Last
>
5.90
</
Last
>
<
Date
>
8/20/2007
</
Date
>
<
Time
>
9:37pm
</
Time
>
<
Change
>
+0.14
</
Change
>
<
Open
>
5.90
</
Open
>
<
High
>
5.95
</
High
>
<
Low
>
5.85
</
Low
>
<
Volume
>
17503092
</
Volume
>
<
MktCap
>
N/A
</
MktCap
>
<
PreviousClose
>
5.76
</
PreviousClose
>
<
PercentageChange
>
+2.43%
</
PercentageChange
>
<
AnnRange
>
3.23 - 6.35
</
AnnRange
>
<
Earns
>
0.00
</
Earns
>
<
P-E
>
N/A
</
P-E
>
<
Name
>
"
</
Name
>
</
Stock
>
</
StockQuotes
>
</
string
>
可以看到中国工商银行股票在8/20/2007 日9:37pm 时(采用的是GMT -5时区的时间,与北京时间差13个小时)的股票价格是5.90 元,返回的信息中还包括股票当天的最高价,最低价,昨日收盘价等信息。这个股票报价的Web服务是免费的,但是有大约50分钟的延迟。
Web服务(Web Services )原理
Web服务是一种面向服务的架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。
根据W3C的定义, Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是一组应用程序接口(API),它们部署在网络系统(如国际互联网)的远程服务器端,客户提交特定的请求来访问这些接口,使程序执行。
在上图Web Services的体系结构图中,有三种角色和三种技术。以前面的股票报价Web服务来解释这些名词:
三种角色
-
服务提供者(Service Provider):股票报价Web服务是由Symbol公司开发的,那么Symbol公司就是Web服务的提供者。
-
服务中介(Service Broker): Web服务需要被人查找到, 才能被用户使用, 因此需要一个地方来注册并发布Web服务.而http://www.webservicex.net/就提供了这么一个地方.这个网站被称为 Service Broker
-
服务请求者(Service Requeter): 任何使用这个Web服务的人员或者组织.
三种技术: WSDL, SOAP 以及UDDI
1。WSDL(Web Services Description Language )
一个XML格式文档,用以描述服务端口访问方式和使用协议的细节。通常用来辅助生成服务器和客户端代码及配置信息。
在浏览器中输入“http://www.webservicex.net/stockquote.asmx?WSDL “,可以看到WSDL文档的详细内容。
股票报价Web 服务的WSDL中定义了名为”StockQuote”的Web服务,以及使用SOAP文档作为参数的方法"GetQuote". 这个WSDL还定义了基于HttpGet和HttpPost的方法,但这不在本文讨论范围之内.
<
wsdl:binding
name
="StockQuoteSoap"
type
="tns:StockQuoteSoap"
>
<
soap:binding
transport
="http://schemas.xmlsoap.org/soap/http"
style
="document"
/>
<
wsdl:operation
name
="GetQuote"
>
<
soap:operation
soapAction
="http://www.webserviceX.NET/GetQuote"
style
="document"
/>
<
wsdl:input
>
<
soap:body
use
="literal"
/>
</
wsdl:input
>
<
wsdl:output
>
<
soap:body
use
="literal"
/>
</
wsdl:output
>
</
wsdl:operation
>
</
wsdl:binding
>
......
<
wsdl:service
name
="StockQuote"
>
<
wsdl:port
name
="StockQuoteSoap"
binding
="tns:StockQuoteSoap"
>
<
soap:address
location
="http://www.webservicex.net/stockquote.asmx"
/>
</
wsdl:port
>
</
wsdl:service
>
2。SOAP(Simple Object Access Protocol, )
SOAP是一个基于XML的可扩展消息信封格式,需同时绑定一个传输用协议。这个协议通常是HTTP 或 HTTPS,但也可能是SMTP 或XMPP。
Web服务使用者, 调用Web服务的方法, 使用的是SOAP格式的参数. 在前面的例子中, 发送请求的SOAP内容如下:
SOAP request
POST /stockquote.asmx HTTP/1.1
Host: www.webservicex.net
Content-Type: text/xml; charset=utf-8
Content-Length: unknown
SOAPAction: "http://www.webserviceX.NET/GetQuote"
<?
xml version="1.0" encoding="utf-8"
?>
<
soap:Envelope
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
xmlns:soap
="http://schemas.xmlsoap.org/soap/envelope/"
>
<
soap:Body
>
<
GetQuote
xmlns
="http://www.webserviceX.NET/"
>
<
symbol
>
601988.SS
</
symbol
>
</
GetQuote
>
</
soap:Body
>
</
soap:Envelope
>
从web服务返回的相应SOAP内容如下:
SOAP response
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: unknown
<?
xml version="1.0" encoding="utf-8"
?>
<
soap:Envelope
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
xmlns:soap
="http://schemas.xmlsoap.org/soap/envelope/"
>
<
soap:Body
>
<
GetQuoteResponse
xmlns
="http://www.webserviceX.NET/"
>
<
GetQuoteResult
><
string
xmlns
="http://www.webserviceX.NET/"
><
StockQuotes
><
Stock
><
Symbol
>
601988.SS
</
Symbol
><
Last
>
5.90
</
Last
><
Date
>
8/20/2007
</
Date
><
Time
>
9:37pm
</
Time
><
Change
>
+0.14
</
Change
><
Open
>
5.90
</
Open
><
High
>
5.95
</
High
><
Low
>
5.85
</
Low
><
Volume
>
17503092
</
Volume
><
MktCap
>
N/A
</
MktCap
><
PreviousClose
>
5.76
</
PreviousClose
><
PercentageChange
>
+2.43%
</
PercentageChange
><
AnnRange
>
3.23 - 6.35
</
AnnRange
><
Earns
>
0.00
</
Earns
><
P-E
>
N/A
</
P-E
><
Name
>
"
</
Name
></
Stock
></
StockQuotes
></
string
>
</
GetQuoteResult
>
</
GetQuoteResponse
>
</
soap:Body
>
</
soap:Envelope
>
3。UDDI(Universal Description, Discovery, and Integration)
UDDI是一个用来发布和搜索WEB服务的协议,应用程序可藉由此协议在设计或运行时找到目标WEB服务。
UDDI的作用类似于常见的电话本,Web服务要在某个地方注册,登记之后,才能被其它组织或个人查找到并使用Web服务的种种功能。例如提供股票报价的Web服务的网站(http://www.webservicex.net)就提供Web服务存放及查找。
在2000年九月发布了UDDI之后, IBM, Microsoft 和 SAP等公司提供了免费的UDDI注册服务器,用户可以在申请用户名及密码之后,在服务器上提交自己的Web服务。但是在2005年UDDI 3.0正式成为 OASIS的标准之后, IBM, Microsoft 和 SAP宣布自2006年12月之后,不再提供公用的UDDI注册服务。
目前, 有关UDDI注册服务则由相关的产品实现,比如
-
Sun Microsystems
公司的 The Java Web Services Developer Pack
-
IBM
公司的 WebSphere UDDI Registry
-
Microsoft
公司的 Microsoft® Windows Server 2003 Enterprise UDDI Services
使用这些Web服务产品,企业可以搭建内部的或者外部的UDDI服务器。Sun Microsystems 公司的The Java Web Services Developer Pack (JWSDP)1.6 中, 即支持UDDI 3.0, 也支持 ebXML (Electronic Business using XML).
实时的股票报价的Web服务已经被用在了很多教程中,也可以针对这个Web服务开发实际的应用,比如建立客户端来调用Web服务StockQuote。这就需要对返回的XML格式的字符串进行解析,可以采用JAXP(Java API for XML processing)包。JAVA SE 5 中已经包含JAXP包, 不需要单独下载。
本文的目的主要是为了阐述JAVA EE 5 平台上实现Web服务的过程,因此在建立一个类似的股票报价的Web服务时,简化了股票报价的逻辑。在Web服务的返回信息中,仅包含静态的股票价格。
以下分几个部分讲述JAVA EE 5平台上实现一个模拟的股票行情Web服务,并且采用不同的客户端来调用这个Web服务。客户端包括:瘦客户端,胖客户端以及移动客户端。
-
JAVA EE 5平台上实现Web服务实例(模拟股票行情机)
-
瘦客户端(thin client)调用Web服务
-
胖客户端(rich client)调用Web服务
-
移动客户端(mobile client)调用Web服务