webservice入门.docx

上传人:b****5 文档编号:3729849 上传时间:2022-11-25 格式:DOCX 页数:35 大小:47.73KB
下载 相关 举报
webservice入门.docx_第1页
第1页 / 共35页
webservice入门.docx_第2页
第2页 / 共35页
webservice入门.docx_第3页
第3页 / 共35页
webservice入门.docx_第4页
第4页 / 共35页
webservice入门.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

webservice入门.docx

《webservice入门.docx》由会员分享,可在线阅读,更多相关《webservice入门.docx(35页珍藏版)》请在冰豆网上搜索。

webservice入门.docx

webservice入门

一:

什么是WebService

WebService(Web服务)是使应用程序可以以与平台和编程语言无关的方式进行相互通信的一项技术。

Web服务是一个软件接口,它描述了一组可以在网络上通过标准化的XML消息传递访问的操作。

它使用基于XML语言的协议来描述要执行的操作或者要与另一个Web服务交换的数据。

一组以这种方式交互的Web服务在面向服务的体系结构(Service-OrientedArchitecture,SOA)中定义了特殊的Web服务应用程序。

1:

Web服务体系结构

Web服务体系结构描述了一个框架,在这个框架中服务可在分布式计算环境中被动态地描述、发布、发现和调用。

这个体系结构定义了四个基本构件(它们的名称在接下去的两段中用粗体字来标明)和三个决定这些构件之间如何交互的标准操作。

服务这个概念处于Web服务模型的核心,它被定义为执行某种任务(如订购图书或翻译信件)的一组操作。

在Web服务的上下文中,可以使用标准的XML技术(如SOAP、WSDL和UDDI)来描述、发现和调用服务。

服务由服务提供者来实现和发布。

服务由服务请求者来发现和调用。

有关服务的信息可被保存在服务注册中心。

下面这张图说明了这三个构件之间是如何交互的。

从企业角度看,服务提供者是服务的所有者。

从技术角度看,它是提供对服务的访问的平台。

同样,服务请求者既是一个需要完成一项具体任务的企业,也是发现和调用服务所需的工具。

可以从如下角度对上图所示的三种基本操作进行描述:

∙发布(Publish):

由服务提供者来执行以使大家知道服务的存在和功能。

∙发现(Find):

由服务请求者来执行以定位能满足某种需要的服务。

∙绑定(Bind):

由服务请求者来执行以调用由服务提供者提供的服务。

 

二:

能干什么

1:

成为各孤立的站点之间的信息能够相互通信、共享的一种接口

2:

由于webservice基于标准的协议和xml,使得大量异构程序和平台之间就能够互相操作,大家都面向webservice,而不用去关心具体的实现是由什么开发语言提供的。

三:

有什么

1:

基本Web服务规范

Web服务规范通常归为两类:

基本Web服务规范和扩展Web服务规范。

基本规范有:

(1)SOAP(SimpleObjectAccessProtocol):

简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的轻量级协议,是一个基于XML的协议。

使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一种语言相互通信。

SOAP包括四个部分:

SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encodingrules),用于表示应用程序需要使用的数据类型的实例;SOAPRPC表示(RPCrepresentation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。

应用中比较关注的是envelop,由一个或多个Header和一个Body组成。

(2)WSDL(WebServicesdescriptionLanguage):

Web服务描述语言是详细说明描述基于SOAP的Web服务的标准方式的规范,由Ariba、Intel、IBM、MS等共同提出,包括消息应采用的形式以及应将其发送到何处。

其中还详细说明了此类消息的响应。

当与相应的工具结合使用时,WSDL允许以编程方式创建对Web服务的调用,甚至不用知道所查找的Web服务是什么;应用程序可以从WSDL文件中提取这些详细信息,并提供要使用的编程接口。

可描述Web服务的三个基本属性:

·服务做些什么——服务所提供的操作(方法)

·如何访问服务——和服务交互的数据格式以及必要协议

·服务位于何处——协议相关的地址,如URL

WSDL文档以端口集合的形式来描述Web服务,WSDL服务描述包含对一组操作和消息的一个抽象定义,绑定到这些操作和消息的一个具体协议,和这个绑定的一个网络端点规范。

WSDL描述语言一般包含三部分

(1)服务做些什么部分:

包括了type、message和portType元素

Type:

定义了WebService使用的数据结构(使用XMLSchema定义)

Message:

一个Message是SOAP的基本通信元素。

每个Message可以有一个或多个Part,每个Part代表一个参数。

PortType:

消息汇总为不同的操作并归入到一个被称为portType的实体中。

一个portType代表一个接口(WebService支持的操作集合),每个WebService可以有多个接口,它们都使用portType表示。

每个操作又包含了input和output部分。

(2)如何访问服务部分:

包含binding元素

binding元素将portType绑定到特定的通信协议上(如HTTP上的SOAP协议)

(3)服务位于何处部分:

由service元素组成

它将portType,binding以及WebService实际的位置(URI)放在一起描述

(3)WSDD(WebServiceDeploymentDescriptor)就是WEB服务分布描述,它定义了WEB服务的接口,如服务名、提供的方法、方法的参数等信息。

(4)UDDI(UniversalDescription,DiscoveryandIntegration):

统一描述、发现和集成是一项从最初提出后发生了一系列变化的标准。

UDDI用于集中存放和查找WSDL描述文件,起着目录服务器的作用。

其最初的目的是为了给各个公司提供在全球注册中心中注册服务并在此注册中心中搜索可能想使用的服务的机制。

不过,由于很多公司对于将其系统对外开放的问题上都相当保守,这个目标并没有完全实现。

但是,很多公司已将UDDI作为内部的服务及服务信息注册中心使用

2:

扩展Web服务规范

总共有数十种WS-*规范,其中几种对企业尤为有用。

即:

∙WS-Security:

此规范处理加密和数字签名,允许创建特定类型的应用程序,以防止窃听消息,且能实现不可否认功能。

∙WS-Policy:

此规范对WS-Security进行了扩展,允许更具体地说明谁可以采用何种方式使用服务。

∙WS-I:

尽管Web服务应设计成具有互操作性,但在实际中,各个规范对不同实现的解释的灵活性常常足以导致出现问题。

WS-I提供了一组可用于防止出现各种问题的标准和实践,并提供了标准化测试来检查问题。

∙WS-BPEL:

单个服务很好处理,但应用程序在大多数情况下则较难处理。

企业级计算要求至少将多个服务组合为一个完整的系统,而WS-BPEL提供了用于指定创建此类系统所必需的交互(如分支和并发处理)。

四:

怎么做

(一)目前常见的实现方式

开源最流行的是Apache的Axis(ApacheExtensibleInteractionSystem),可以跟所有的主流服务器结合。

SUN,早期时JAX-RPC,现在是JAX-WS

IBM采用的是自行开发的WSDK(IBMWebSphereSDKforWebServices)

我们采用:

tomcat+axis2

(二):

HelloWorld一

1:

构建运行环境

(1)把axis2-1.4.1-war.zip中的axis2.war包放到tomcat的webapps中,然后启动tomcat,会发布axis2,如果启动没有错误,就可以下一步

(2)验证:

在地址栏输入http:

//localhost:

8080/axis2,如果能正常显示,说明axis2的运行环境已经OK了。

可以点击Administration,然后输入用户名admin和密码axis2进入管理台。

2:

构建开发环境

把axis2-1.4.1-bin.zip中lib里面的都引入到当前的开发环境中就好了

3:

写自己的第一个服务的类

packagecn.javass.ws.helloworld.server;

importorg.apache.axiom.om.OMAbstractFactory;

importorg.apache.axiom.om.OMElement;

importorg.apache.axiom.om.OMFactory;

importorg.apache.axiom.om.OMNamespace;

publicclassMyService{

/**

*读取client端传递来的参数,然后执行自己的功能,并返回值给客户端

*/

publicOMElementhelloWorldService(OMElementin){

//1:

接收参数,将in转换为String

StringrequestMessage=in.getText();

//2:

这里添加服务端的具体处理

//3:

准备返回

//3.1创建响应用的SOAP包。

OMFactoryf=OMAbstractFactory.getOMFactory();

//3.2OMNamespace指定此SOAP文档名称空间,可以随便写

OMNamespaceomNs=f.createOMNamespace(""cc");

//3.3创建返回元素,并指定其在omNs指代的名称空间中。

OMElementretElement=f.createOMElement("myRet",omNs);

//3.4指定返回元素的文本内容

StringretMessage=requestMessage+",这是第一个WebService,已经处理!

";

retElement.setText(retMessage);

returnretElement;

}

}

4:

在src目录下面建立一个META-INF的文件夹,在里面放Services.xml文件

false">

cn.javass.ws.helloworld.server.MyService

class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>

5:

运行cmd,到classes的目录,然后打包,输入:

jarcvfhello.aar.,注意后面的”.”不能少,表示输出到当前位置,然后打出一个hello.aar的包来。

6:

然后可以直接把这个文件拷贝到tomcat的webapps\axis2\WEB-INF\services文件夹下面,就会自动发布了。

当然也可以进到axis2的控制台,然后使用uploadservice的方式也行。

如果发布没有错误,那么服务就做好了。

7:

开始写客户端

packagecn.javass.ws.helloworld;

importorg.apache.axiom.om.OMAbstractFactory;

importorg.apache.axiom.om.OMElement;

importorg.apache.axiom.om.OMFactory;

importorg.apache.axiom.om.OMNamespace;

importorg.apache.axis2.AxisFault;

importorg.apache.axis2.Constants;

importorg.apache.axis2.addressing.EndpointReference;

importorg.apache.axis2.clustering.MessageSender;

importorg.apache.axis2.client.Options;

importorg.apache.axis2.client.ServiceClient;

publicclassClient{

publicstaticvoidmain(String[]args){

try{

//1:

targetEPR指定打包的Service(hello.aar文件)在容器中的物理位置

EndpointReferencetargetEPR=newEndpointReference(

"http:

//localhost:

8080/axis2/services/HelloWorldService");

//2:

准备客户端调用

ServiceClientsender=newServiceClient();

//2.1准备options,设置要访问的web服务在什么地方

Optionsoptions=newOptions();

options.setTo(targetEPR);

sender.setOptions(options);

//2.2创建request的SOAP包

OMFactoryf=OMAbstractFactory.getOMFactory();

//2.3OMNamespace指定此SOAP文档名称空间,要跟服务那边的对应上

OMNamespaceomNs=f.createOMNamespace("

//2.4创建元素reqElement,并指定其在omNs指代的名称空间中,第一个参数就是要访问的operation

OMElementreqElement=f.createOMElement("helloWorldService",omNs);

//2.5指定元素的文本内容。

reqElement.setText("测试第一个WebService");

//3:

发出requestSOAP,同时将得到的远端由helloWorldService方法返回的信息保存到result

OMElementresult=sender.sendReceive(reqElement);

System.out.println(result);

}catch(ExceptionaxisFault){

axisFault.printStackTrace();

}

}

}

8:

运行结果如下:

客户端:

myRetxmlns:

cc="

 

(三):

HelloWorld二(Pojo)

1:

把axis2-1.4.1-bin包解开,然后把下面直到bin的路径设置到path中去,还要设置AXIS2_HOME的值

2:

到axis2-1.4.1-bin包的samples文件夹中,找到quickstart,建立一个工程来测试和运行它,类文件如下:

packagesamples.quickstart.service.pojo;

importjava.util.HashMap;

publicclassStockQuoteService{

privateHashMapmap=newHashMap();

publicdoublegetPrice(Stringsymbol){

Doubleprice=(Double)map.get(symbol);

if(price!

=null){

returnprice.doubleValue();

}

return42.00;

}

publicvoidupdate(Stringsymbol,doubleprice){

map.put(symbol,newDouble(price));

}

}

3:

运行cmd,把路径设置到classes下面,然后运行:

java2wsdl-cp.-cnsamples.quickstart.service.pojo.StockQuoteService-ofMETA-INF/StockQuoteService.wsdl,就会生成相应的wsdl文件

4:

在META-INF中建立services文件,内容如下:

StockQuoteSampleService

mep="http:

//www.w3.org/2004/08/wsdl/in-only"

class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>

mep="http:

//www.w3.org/2004/08/wsdl/in-out"

class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>

samples.quickstart.service.pojo.StockQuoteService

5:

运行cmd,把路径设置到classes下面,然后运行:

jarcvfht.aar.,注意后面有个”.”,然后打好包,文件名称叫ht.aar

6:

把ht.aar拷贝到tomcat的webapps\axis2\WEB-INF\services

7:

启动tomcat,然后运行http:

//localhost:

8080/axis2/services/listServices就可以查看所有发布的服务了

8:

可以通过http:

//localhost:

8080/axis2/services/StockQuoteService?

wsdl来查看wsdl的文件,对应的schema在http:

//localhost:

8080/axis2/services/StockQuoteService?

xsd

9:

可以在IE里面进行测试,测试步骤如下:

(1)运行下述语句进行查看

http:

//localhost:

8080/axis2/services/StockQuoteService/getPrice?

symbol=javasscn会得到如下结果:

getPriceResponsexmlns:

ns="http:

//pojo.service.quickstart.samples">

 

return>42.0

return>

 

getPriceResponse>

(2)然后运行下述语句进行修改

http:

//localhost:

8080/axis2/services/StockQuoteService/update?

symbol=javasscn&price=100

(3)再次运行

(1),你会发现结果变成了:

getPriceResponsexmlns:

ns="http:

//pojo.service.quickstart.samples">

 

return>100.0

return>

 

getPriceResponse>

(四):

HelloWorld二改进版(AXIOM)

1:

类文件修改成为

packagesamples.quickstart.service.axiom;

importjavax.xml.stream.XMLStreamException;

importorg.apache.axiom.om.OMAbstractFactory;

importorg.apache.axiom.om.OMElement;

importorg.apache.axiom.om.OMFactory;

importorg.apache.axiom.om.OMNamespace;

importjava.util.HashMap;

publicclassStockQuoteService{

privateHashMapmap=newHashMap();

publicOMElementgetPrice(OMElementelement)throwsXMLStreamException{

//构建节点本身

element.build();

//从父节点删除本节点

element.detach();

//获取节点的第一个子节点

OMElementsymbolElement=element.getFirstElement();

//获取这个子节点的文本值

Stringsymbol=symbolElement.getText();

//准备返回的值

StringreturnText="42";

Doubleprice=(Double)map.get(symbol);

if(price!

=null){

returnText=""+price.doubleValue();

}

//组装需要返回的xml,值也包含在这个xml当中

//

//

//returnText

//

//

OMFactoryfac=OMAbstractFactory.getOMFactory();

OMNamespaceomNs=fac.createOMNamespace(

"http:

//axiom.service.quickstart.samples/xsd","tns");

OMElementmethod=fac.createOMElement("getPriceResponse",omNs);

OMElementvalue=fac.createOMElement("price",omNs);

value.ad

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1