加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Webservice理解和使用小记

发布时间:2020-12-16 22:34:37 所属栏目:安全 来源:网络整理
导读:最近,需要通过Webservice访问不同的数据接口,也试用了不同方式的调用webservice服务。在这里简单整理,做下笔录,供参考和备忘。博文主要参考了《彻底理解webservice SOAP WSDL》(http://www.voidcn.com/article/p-ryejjwwh-ry.html) ?、《Web Services

最近,需要通过Webservice访问不同的数据接口,也试用了不同方式的调用webservice服务。在这里简单整理,做下笔录,供参考和备忘。博文主要参考了《彻底理解webservice SOAP WSDL》(http://www.voidcn.com/article/p-ryejjwwh-ry.html)?、《Web Services 中XML、SOAP和WSDL的一些必要知识》(http://www.voidcn.com/article/p-ybeojeuk-bhm.html)和《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这种服务方式,再补充。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读