Webservice理解和使用小记

最近,需要通过Webservice访问不同的数据接口,也试用了不同方式的调用webservice服务。在这里简单整理,做下笔录,供参考和备忘。博文主要参考了《彻底理解webservice SOAP WSDL》(http://blog.csdn.net/zhuizhuziwo/article/details/8153327 、《Web Services 中XML、SOAP和WSDL的一些必要知识》(http://blog.csdn.net/tianlincao/article/details/7654166)和《JAVA的 WebService规范 JAX-WS实现例子
》(
http://outofmemory.cn/code-snippet/9160/java-jaxb-webservice-example ),多谢几位作者的分享!

一、Webservice的理解

1.概念:Web 服务定义了如何在异构系统之间实现通信的标准化方法,从而就使得 Web 服务可以跨越运行平台和实现语言,同时也使得 Web 服务成为了实现 SOA 中服务的主要技术。Web Services 是由xml来定义数据格式的,通过SOAP协议(可类似看做Http协议)在各个系统平台中传输。

在Web 服务的体系结构中,涉及到三个角色,一个是 Web 服务提供者(即服务器端),一个是 Web 服务中介者(即代理),还有一个就是 Web 服务请求者(客户端),同时还涉及到三类动作,即发布,查找,绑定。

2.Webservice的主要元素

(1)SOAP 

SOAP 即 Simple Object AccessProtocol 也就是简单对象访问协议,是一种用于访问 Web 服务的协议。SOAP 基于XML 和 HTTP ,其通过XML 来实现消息描述,然后再通过 HTTP 实现消息传输,用于在应用程序之间进行通信的一种通信协议,因为是基于 XML 和HTTP 的,所以其独立于语言,独立于平台,并且扩展性很好。SOAP 协议的一个重要特点是它独立于底层传输机制,Web 服务应用程序可以根据需要选择自己的数据传输协议,可以在发送消息时来确定相应传输机制。

一个典型的SOAP请求格式的结构如下:
<?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:Header>
<m:Trans xmlns:m="http://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
<soap:Body>
<m:GetPrice xmlns:m="http://www.w3schools.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
a) Envelope
SOAP的请求内容必须以Envelope做为根节点。
xmlns:soap="http://www.w3.org/2001/12/soap-envelope",不能修改,否则会出错。http://www.w3.org/2001/12/soap-envelope里面有Envelope的schema的相关定义。有兴趣的可以去这个链接的内容。
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding",这个指定了数据元素的类型。
b) Header
这个是可选的,如果需要添加Header元素,那么它必须是Envelope的第一个元素。
Header的内容并没有严格的限制,我们可以自己添加一些和应用程序相关的内容,但是客户端一定要记得处理这些Header元素,可以加上mustUnderstand强制进行处理。
c) Body
这个就是请求的主题内容了,请求什么函数,参数是什么类型等等都在这里面指定。 
用标签表示一个函数,然后用子元素表示它的参数。

在调用中没有指定参数和返回类型,这里不需要指定,因为提供服务的一方自己已经规定好了数据类型,在调用时指定数据类型没有任何意义。

(2)WSDL 

WSDL 即Web Services Description Language也就是 Web 服务描述语言,是基于 XML的用于描述 Web 服务以及如何访问 Web 服务的语言。服务提供者通过服务描述将所有用于访问 Web服务的规范传送给服务请求者,要实现 Web服务体系结构的松散耦合,服务描述是一个关键,不管是请求者还是服务提供者,通过服务描述便可以不必了解对方的底层平台,编程语言等,服务描述与底层的 SOAP 基础结构相结合,足以封装服务请求者的应用程序和服务提供者的 Web服务之间的这个细节。

WSDL 描述了 Web服务的三个基本属性:服务所提供的操作、如何访问服务、服务位于何处(URL地址)

WSDL是用来描述WebService的,它用XML的格式描述了WebService有哪些方法、参数类型、访问路径等等。我们要使用一个WebService肯定首先要获取它的WSDL,这些工作由开发环境帮我们做了,开发环境根据WSDL文档给Web Service生成了相应的代理类供我们使用。

3.Webservice使用

Web 服务分为Server和Client 两部分,Server 公开Web 服务,Client 调用Web 服务,JAX-WS 的服务端、客户端双方传输数据使用的SOAP 消息格式封装数据。

(1)整体流程

引入cxf相关jar包

公开Webservice服务接口、接口实现类、涉及的实体类、发布Web服务、访问和查看WSDL和客户端调用。

(2)创建服务端

定义接口及其实现类,并加上Webservice注解。

@WebService
定义实体类,并加上XmlRootElement注解。

 @XmlRootElement(name = "XXX")
通过Endpoint的publish方法进行发布服务,注意设定访问的服务地址及其对应的接口实现类。

 Endpoint.publish("http://127.0.0.1:8080/XXXService",new XXXServiceImpl());
查看wsdl     
http://127.0.0.1:8080/xxxService?wsdl


(3)客户端请求服务

Web 服务只向客户端暴漏WSDL,那么客户端必须将WSDL 转换为自己的编程语言书写的代码.JAX-WS 的各种实现都提供相应的工具进行WSDL 与JAVA 之间的互相转换,你可以在CXF 的运行包中找到bin 目录,其中的wsdl2java.bat 可以将WSDL转换为JAVA 类,bin 目录的各种bat 的名字可以很容易知道其作用,但要注意JAVA 类转换为WSDL 最好使用前面的URL?wsdl 的方式获得,因为这样得到的是最准确的.你可以在命令行将当前目录切换到CXF 的bin 目录,然后运行wsdl2java –h 查看这个批处理命令的各个参数的作用,常用的方式就是 wsdljava –p 包路径 –d 目标文件夹 wsdl 的 url地址.现在我们将前面的WSDL生成客户端代码:

wsdl2java -p com.xx.xxx.xxx –d E:\ http://127.0.0.1:8080/xxxService?wsdl
你会在E 盘根目录找到生成的客户端代码,然后将它复制到Eclipse 工程即可使用.

如果你使用Eclipse的新建工程方式,可以按照如下步骤从WSDL 生成客户端代码:

New--->Other--->Eclipse--->Web Services--->Web Services Client,然后依据设置向导即可完成。

在 CXF 中使用JaxWsProxyFactoryBean 客户端代理工厂调用Web 服务。

如果跟spring框架结合的话,可以通过application-context.xml进行配置,主要是服务类位置和服务地址,调用时直接得到对应的bean,然后直接调用方法。

也可以直接在程序代码中来创建代理工厂类调用服务,如下来调用:

JaxWsProxyFactoryBean soapFactoryBean = new JaxWsProxyFactoryBean();
soapFactoryBean.setAddress("http://127.0.0.1:8080/xxxService");
soapFactoryBean.setServiceClass(xxx.class);
Object o = soapFactoryBean.create();
IHelloService helloService = (IHelloService) o;
xxxService.xxx(parma)


大致应用了以上提到的几种方式,后续还需去仔细体会Webservice这种服务方式,再补充。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值