webService基本概念、元素及简单编码实现

webService

"网络服务"(Web Service)的本质,就是经过网络调用其余网站的资源。 网络服务是相对于本地服务来讲的,本机完成本机须要完成的任务,叫“本地服务”,而“网络服务”则是经过网络来调用其余服务器提供的服务。html

webService和中间件的关系:webService是一种技术手段,是一种网络中系统之间进行交互的方式。而中间件则是实现这种交互的一种手段(一种软件、服务)。java

定义:WebService是一种跨编程语言和跨操做系统平台的远程调用技术(rpc)。 实现平台无关性和语言无关性的关键是用一种标准来统必定义相互通讯的接口,而WebService平台技术就是旨在解决统一标准的问题。 引用:Web service是什么?web

WebService平台技术 XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。 SOAP和WSDL的详细格式和解析可见:SOAP和WSDL的一些必要知识 or 备用地址apache

XML和XSD: WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪一个方法,传递的参数是什么,以及服务对象的返回结果是什么)。 XML是WebService平台中表示数据的格式。除了易于创建和易于分析外,XML主要的优势在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。 XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底表明什么?16位,32位,64位?这些细节对实现互操做性很重要。 XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService平台就是用XSD来做为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,全部你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你极可能会根据你的须要修改一下转换过程。编程

xsd就是基于xml,本身定义了一套标签,用来对webService中的数据表示格式进一步规范。api

SOAP: WebService经过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增长了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。SOAP协议 = HTTP协议 + XML 数据格式SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。打个比喻:HTTP就是普通公路,XML就是中间的绿色隔离带和两边的防御栏,SOAP就是普通公路通过加隔离带和防御栏改造过的高速公路。服务器

soap基于xml和http,在http的请求头中加入属性用以标记请求内容格式是soap类型的,而且用soap也是和xsd同样,基于xml的基础上本身定义一套标签,来规范webService请求的一系列参数。网络

WSDL: 比如咱们去商店买东西,首先要知道商店里有什么东西可买,而后再来购买,商家的作法就是张贴广告海报。 WebService也同样,WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法能够调用,因此,WebService务器端首先要经过一个WSDL文件来讲明本身家里有啥服务能够对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪一个url地址表示,服务经过什么方式来调用。 WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。由于是基于XML的,因此WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。 WSDL文件保存在Web服务器上,经过一个url地址就能够访问到它。客户端要调用一个WebService服务以前,要知道该服务的WSDL文件的地址。WebService服务提供商能够经过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。架构

WSDL也是在xml的基础上进行扩展,它是用来描述webservice的,描述了WebService有哪些方法、参数类型、访问路径等等。框架

UDDI: UDDI的目的是为电子商务创建标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业可以发现的访问协议的实现标准。也即一种远程服务发布与注册的标准。


Web Service调用方式

网络上随处可见的“四种调用webService的方式”都是经过jdk1.6以后集成的组件api进行调用。 随处找来的:WebService的四种客户端调用方式(基本) 还有其余的开源框架实现了Web Service,好比axis和cxf。

在SOA领域,咱们认为Web Service是SOA体系的构建单元(building block)。对于服务开发人员来讲,AXIS和CXF必定都不会陌生。这两个产品都是Apache孵化器下面的Web Service开源开发工具。 Axis2的最新版本是1.3.CXF如今已经到了2.0版本。 

这两个框架 都是从已有的开源项目发展起来的。Axis2是从Axis1.x系列发展而来。CXF则是XFire和Celtix项目的结合产品。Axis2是从底层所有从新实现,使用了新的扩展性更好模块架构。 CXF也从新的深化了XFire和Celtix这两个开发工具。 

新产品的退出致使了几个问题。是否是现有的使用Axis 1.x,XFire和Celix的应用须要迁移的新的版本上。若是一个开发人员肯定要迁移它的应用到新的框架上,那么他应该选择哪个呢?相反的,若是一个开发者决定从头开发一个新的Web Service,他应该使用哪一个呢? 这两个框架哪个更好一些呢? 

对于系统迁移来讲,也许迁移到新的框架并不难。Axis和CXF都提供了迁移的指导。可以给开发者一些迁移的技巧和经验。可是对于这样迁移,这两个开源项目都没有提供迁移的工具。对于这样的迁移工做,尽管很值得去寻找全部的可行方案。Axis2和CXF都有各自不一样的WebService开发方法,每一个方法都有至关数量拥护者。 

经过一个比较矩阵来比较Axis2和CXF变得有现实的意义。这两个项目都开发不够成熟,可是最主要的区别在如下几个方面: 

1.CXF支持 WS-Addressing,WS-Policy, WS-RM, WS-Security和WS-I Basic Profile。Axis2不支持WS-Policy,可是承诺在下面的版本支持。 

  1. CXF能够很好支持Spring。Axis2不能 

  2. AXIS2支持更普遍的数据并对,如XMLBeans,JiBX,JaxMe和JaxBRI和它自定义的数据绑定ADB。注意JaxME和JaxBRI都仍是试验性的。CXF只支持JAXB和Aegis。在CXF2.1 

  3. Axis2支持多语言-除了Java,他还支持C/C++版本。 

比较这两个框架的Web Service开发方法与比较它们的特性一样重要。 从开发者的角度,两个框架的特性至关的不一样。 Axis2的开发方式相似一个小型的应用服务器,Axis2的开发包要以WAR的形式部署到Servlet容器中,好比Tomcat,经过这些容器能够对工做中的Web Service进行很好的监控和管理。Axis2 的Web administrion模块可让咱们动态的配置Axis2.一个新的服务能够上载,激活,使之失效,修改web服务的参数。管理UI也能够管理一个或者多个处于运行状态的服务。这种界面化管理方式的一个弊端是全部在运行时修改的参数没有办法保存,由于在重启动以后,你所作的修改就会所有失效。 

Axis2容许本身做为独立的应用来发布Web Service,并提供了大量的功能和一个很好的模型,这个模型能够经过它自己的架构(modular architecture)不断添加新的功能。有些开发人员认为这种方式对于他们的需求太过于繁琐。这些开发人员会更喜欢CXF。 

CXF更注重开发人员的工效(ergonomics)和嵌入能力(embeddability)。大多数配置均可以API来完成,替代了比较繁琐的XML配置文件, Spring的集成性常常的被说起,CXF支持Spring2.0和CXF's API和Spring的配置文件能够很是好的对应。CXF强调代码优先的设计方式(code-first design),使用了简单的API使得从现有的应用开发服务变得方便。 

不过你选择Axis2仍是CXF,你均可以从开源社区获得大量的帮助。这两个框架都有商业公司提供服务,WSO2提供AXIS2的支持,Iona提供CXF的支持。这两公司都有很活跃的开发者社区。 Axis2出现的时间较早,CXF的追赶速度快。个人建议是:若是你须要多语言的支持,你应该选择AXIS2。若是你须要把你的实现侧重JAVA并但愿和Spring集成,CXF就是更好的选择,特别是把你的Web Service嵌入其余的程序中。若是你以为这两个框架的新特性对于你并无太大的用处,你会以为Axis1也是不错的选择,你应该继续使用它知道你有充分的理由去更换它。

cxf方式调用webService

参考连接:CXF提供Client调用WebService接口的方法

一、 JaxWsProxyFactoryBean
简介: 调用方式采用了和RMI相似的机制,即客户端直接服务器端提供的服务接口(interface),CXF经过运行时代理生成远程服务的代理对象,在客户端完成对webservice的访问; 几个必填的字段:setAddress-这个就是咱们发布webservice时候的地址,保持一致 缺点: 这种调用service的好处在于调用过程很是简单,就几行代码就完成一个webservice的调用,可是客户端也必须依赖服务器端的接口,这种调用方式限制是很大的,要求服务器端的webservice必须是java实现--这样也就失去了使用webservice的意义

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class Client {  
    public static void main(String[] args) {  
        JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean();  
        bean.setServiceClass(HelloWorldService.class);  
        bean.setAddress("http://localhost:9090/helloWorldService");  
        HelloWorldService helloWorldService = (HelloWorldService)bean.create();  
        String result = helloWorldService.sayHello("Kevin");  
        System.out.println(result);  
    }

二、 JaxWsDynamicClientFactory [Dynamic:动态的] 简介: 只要指定服务器端wsdl文件的位置,而后指定要调用的方法和方法的参数便可,不关心服务端的实现方式。 wsdl [Web Services Description Language]网络服务描述语言是Web Service的描述语言,它包含一系列描述某个web service的定义

import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
public class Client2 {  
    public static void main(String[] args) throws Exception {  
        JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();  
        Client client = clientFactory.createClient("http://localhost:9090/helloWorldService?wsdl");  
        Object[] result = client.invoke("sayHello", "KEVIN");  
        System.out.println(result[0]);  
    }  
}

三、JaxWsServerFactoryBean 用JaxWsServerFactoryBean发布,须要独立的jetty包。

相关文章
相关标签/搜索