`
jameswxx
  • 浏览: 772025 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

webservice简介

阅读更多

       从表面上看,Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。


       下面是对Web service 更精确的解释: 
Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。

Web Service是指由企业发布的完成其特别商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。

 

组成Web service平台的这三个技术

XML和XSD

       可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。

       XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,还是64位?这些细节对实现互操作性都是很重要的。W3C制定的XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web service平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合Web service标准,所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。


SOAP

       Web service建好以后,你或者其他人就会去调用它。简单对象访问协议(SOAP)提供了标准的RPC方法来调用Web service。实际上,SOAP在这里有点用词不当:它意味着下面的Web service是以对象的方式表示的,但事实并不一定如此:你完全可以把你的Web service写成一系列的C函数,并仍然使用SOAP进行调用。SOAP规范定义了SOAP消息的格式,以及怎样通过HTTP协议来使用SOAP。SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。


WSDL

       你会怎样向别人介绍你的Web service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的Web service的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的Web service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码。


      假设我不得不为一个连锁店开发一个程序。这家连锁店分布在全国各地,但是我的产品主目录(master catalog of product)只存放在我的中心办公室的数据库中,并且分店的软件必须能够访问这个产品目录.我可以通过一个被称为ShopService的Web Service 来发布这些目录。重要的是:在网站上发布的时候不能出错。在网站上的信息是为人编写的。而在Web Service上的信息可以被软件访问,并不时直接被人访问(尽管存在人用这个软件的可能)。虽然Web Service 很大程度上依赖现有的Web技术(像我们正在看到的HTTP),但他们和Web浏览器与HTML没有联系。我们再重复一遍: 网站是为人服务的,而Web Service 是为软件服务的 :-)

 

       客户端(在商店的PC)在那个时候将要连接(服务器上的)WebService,并发送一个需要目录的服务请求。服务器将会通过一个服务响应返回目录信息。当然这是一个描述Web Service如何工作的非常潦草的例子。等一下,我们将会看到一个非常详细的解释。


       我们中的一些人可能会这么想:"嘿,等一下!我可以通过RMI,CORBA,EJBs,等很多其他技术来实现啊!"。那么。为什么还要Web Service? 好的,Web Service 也有很多优于其他技术的地方:

Web Service由于使用标准的XML语言因而是平台无关、语言无关的,这就意味着我们的客户端可以用C++编写在windows下运行,而Web Service使用Java编写而运行在linux下,大部分Web Service 使用HTTP传输消息(像服务请求和响应)。如果你想建立一个Internet范围的程序,这是一个主要的优点,因为大部分Internet's的代理和防火墙都不会破坏HTTP的传输(不像CORBA会在穿过防火墙时遇到麻烦) ,当然了,Web Service也存在以下一些缺点:

压力过大。很明显所有在XML中的数据没有定义好的二进制代码效率高。在你赢得通用性的同时降低了效率。尽管那样,这个压力通常是可以被大部分应用程序所接受的, 用途狭窄。目前,由于他们只支持很基本的服务种类,所以Web Service 的用途不是很多。例如CORBA提供给编程者很多正在支持的服务(像持续服务,通知,生命周期管理,转换等等)。事实上,在下一页我们可以看到网格服务可以真正的补偿了用途狭窄的缺点。
  
       然而,分布式的Web Service有一个很重要的特点。像CORBA和EJB技术是面向关系紧密的分布式系统的,它们的客户端和服务端彼此非常依赖。但Web Services是面向松散关系的系统,客户端可以直到真正调用web service才知道Web Service的知识,例如基于网格的应用。

 

一个典型的Web Service的调用

      我们看一下一个完整的Web Service调用的全部的调用步骤。
正如我们前面所说的,一个客户端可以不知道Web Service是如何调用的.所以我们第一步是寻找满足我们要求的Web Servicede 的位置,例如我们想要找一个可以告诉我们美国城市温度的Web Service。我们可以通过与UDDI注册点联系得到Web Service的位置。UDDI注册器将会返回告诉我们哪个服务器可以提供给我们我们想要的服务(像美国城市的温度)
我们现在知道Web Service的位置了,但我们还不知道如何使用它。我们确实知道它可以给我们美国城市的温度,但是真是的服务是如何调用的呢?我们调用的方法可能被称为Temperature getCityTemperature(int CityPostalCode),但是它也可以是
int getUSCityTemp(string cityName, bool isFarenheit).我们必须问Web Service 如何描述自己。(告诉我们如何使用它) 用被称为WSDL的语言返回信息。


      我们终于知道Web Service的位置和如何调用它。调用方法是通过SOAP来实现的。那样我们就发送SOAP请求要求一个城市的温度。 Web Service 将会温和的返回一个包含我们想要的温度的SOAP响应,或者是当我们的请求信息错误时返回一个错误信息。

 

 Web Service的寻址

      但是....如何准确的寻址Web Service?这个答案非常的简单:就像我们的网页。我们使用朴素而简单的URIs(Uniform Resource Identifiers)。如果你熟悉 URL (Uniform Resource Locator)这个名词的话,那就不要担心:URI和URL事实上是同一样东西。

例如UDDI注册服务期可能会返回如下 URI:

http://webservices.mysite.com/weather/us/WeatherService

这个很容易被认为是一个网页的地址。然而Web Service 是通过软件来记住这个地址的(不再是让人直接记住)。如果你写一个Web Service的URI进你的Web浏览器,你可能会的到一个错误信息或者是难以理解的代码(一些Web Service 会显示给你一个漂亮的界面,但是这个界面和通常的不一样)。当你拥有一个Web Service 的URI时,你通常需要将这个URI交给一个程序。事实上,我们写的大部分的客户端程序都会把网格服务URI作为一个命令参数来接收。

 

 

Web Services 的架构

      现在我们已经看到了在Web Service调用过程中的不同活动者,让我们来更清楚地了解Web Service的架构吧!


Service Discovery:

这部分容许我们寻找满足需要的Web Service。这部分通常由UDDI(Universal Description, Discovery, and Integration)来处理。GT3目前不支持UDDI.


Service Description:

Web Service最有趣特点之一就是他们能够自我描述。这意味着一旦你定位了Web Service,你能要求他"描述自己"并告诉你如何操作和使用它。这是通过Web Services Description Language (WSDL)来处理的


Service Invocation:

 调用一个Web Service(和一般的任何类似CORBA对象或者Enterprise Java Beand的分布式服务)的过程中包含在客户端与服务端之间传输的信息。SOAP (Simple Object Access Protocol)规范了我们如何格式化送往服务器的请求信息和如何格式化服务器本身的响应信息。在理论上,我们还可以使用其它调用语言(例如XML_RPC或者 even some ad hoc XML language).然而,SOAP是Web Service更乐意的选择。


Transport:

 最后,这些所有的信息可以在服务端和客户端之间传输。架构这部分选择的协议是HTTP(HyperText Transfer Protocol),与访问Internet上的普通网页的协议相同!在理论上我们仍然能使用其他协议,但HTTP协议是目前使用最广泛的了。

 

Web Service 应用看起来是什么?

      首先,你应该知道尽管存在很多协议和在周围浮现的众多语言,Web Service 编程者通常不用写一行SOAP或者WSDL的代码。一旦我们到了我们的客户端需要调用一个Web Service那一刻时,我们授权给软件中一块叫本地stub(a client stub)的任务。好消息是有很多可以利用的工具为我们自动产生基于WSDL的Web Service描述的本地stub(a client stub)。

 

      这样你不需要逐字地解释"典型的调用"对话过程。一个Web Service客户端通常不会在一个调用过程中经过所有步骤。一个更正确的事件流程如下:

 

我们通过UDDI定位一个满足我们需要的Web Service。
我们获得关于这个Web Service的WSDL描述。
我们产生stub,然后在我们的应用程序中包含它们。
这个应用程序会在每次调用Web Service 时使用stub。

 

      服务端的编程比较容易。我们不用必须写一个复杂的需要动态解释SOAP请求和产生SOAP响应的服务程序,我们能简单的实现我们Web Service的所有功能,然后产生一个服务器stub(the term skeleton is also used),这个stub负责解释请求然后将这些请求转交给服务器的实现部分。当服务器实现部分包含一个结果时,它将会把这个结果交给服务器stub,这样就产生了合适的SOAP响应。这个服务器stub还能通过WSDL描述产生,或者从其他语言(像IDL)定义的接口。此外的是服务器实现和服务器stub都通过软件中被称为Web Service容器的代码来管理,这个容器会确保提交给Web ServviceHTTP请求直接交给服务器stub。

 

调用一个Web Service的步骤


     我们来假设我们的客户端已经定位了Web Service,从WSDL描述产生了客户端stub,并且服务端程序也产生了服务端stub。无论客户端什么时候需要调用Web Service,它都需要调用客户端stub。这个客户端stub会将这个本地调用转换为合适的SOAP请求。这步经常被称为编组过程(marshalling process).


     SOAP请求使用HTTP协议通过网络发送出去。Web Service容器接收到SOAP的请求后将它交给服务器stub。服务器stub把SOAP请求转换服务器实现程序能够理解的形式。这步经常被称为解散。 服务器实现部分收到从服务器stub转来的请求后,执行所请求的工作。例如我们调用了 int add(int a, int b) 方法,服务器实现执行加法功能。 执行请求的结果由服务器stub处理转换为SOAP响应。 SOAP响应使用HTTP协议通过网络发送。客户端stub收到SOAP响应并将它转换为客户端应用可以理解的形式。 最终客户端应用接受到调用Web Service的结果并使用这个结果。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics