一片文章带你了解WebService

本文详细介绍了Java中如何调用已发布的WebService,包括获取WSDL文档、通过WSDL生成客户端代码的方法,以及解决生成代码时可能遇到的问题。还提到了使用Apache CXF生成代码的步骤。

一、什么是web Service

准确的来说,webservice不是一种技术,而是一种规范。是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互。比如在Windows Server服务器上有个C#.Net开发的应用A,在Linux上有个Java语言开发的应用B,现在B应用要调用A应用,或者是互相调用,用于查看对方的业务数据,就需要webservice的规范。
我们一般就是在具体平台开发webservice接口,以及调用webservice接口,每种开发语言都有自己的webservice实现框架。比如Java 就有 Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasyd等等。其中Apache CXF用的比较多,它也可以和Spring整合。

二、JAVA中如何调用别人发布的WebService

一、获取WebService的wsdl文档

什么是wsdl文档

wsdl跟java一样,也是一种语言,是通过xml的形式说明该webservice如何调用。

如何获取wsdl文档

通过在webservice的url后面加?wsdl的方式

WSDL解析

Wsdl文档从下往上读
Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。(入参和出参的数据类型)
Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构(入参和出参)。
Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)。
PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(服务类)。
Binding - 特定服务访问点与具体服务类的绑定(不看内容,看关系)。
Port - 定义为webservice单个服务访问点。
Service- 相关服务访问点的集合。

二、通过wsdl文档生成客户端调用代码

使用jdk自带的命令生成

配置java环境变量后在命令窗口中输入wsimport –s . http://xxxx.xx.xx/xxx?wsdl即可生成java代码
注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。.class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行

注意:可能会报错解析组件 ‘s:schema’ 时出错。在该组件中检测到 's:schem’之类的。

用wsdl生成客户端代码时候,报错如下:
[WARNING] src-resolve.4.2: 解析组件 ‘s:schema’ 时出错。在该组件中检测到 ‘s:schema’ 位于名称空间 ‘http://www.w3.org/2001/XMLSchema’ 中, 但无法从方案文档 ‘http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl#types?schema1’ 引用此名称空间的组件。如果这是不正确的名称空间, 则很可能需要更改 ‘s:schema’ 的前缀。如果这是正确的名称空间, 则应将适当的 ‘import’ 标记添加到
解决方案
1、首先用浏览器解析wsdl文件,并在项目中新建一个wsdl文件,将浏览器wsdl中内容拷贝到项目的wsdl文件中。
2、将<s:element ref=“s:schema” /> <s:any />全部替换为<s:any minOccurs=“2” maxOccurs=“2” />
3、在cmd中用wsimport命令生成客户端代码,这时候的wsdl路径为项目文件中的路径
4、刷新项目,即可看见生成的代码

生成代码后如何调用

先把生成的代码复制到项目中,然后通过读wsdl文档来调用,整体的调用代码类似于下面这样:
//wsdl文档中service的name
SayHelloIntefaceService ss = new SayHelloIntefaceService();
//wsdl文档中portType的name
SayHelloInteface shf = ss.getSayHelloIntefacePort();
//wdl文档中complexType的name
String str = shf.sayhellow("lisi");
//str即为webservice的服务端返回的信息
System.out.println(str);

三、根据wsdl文件使用cxf生成代码

1、下载apache-cxf-2.6.2包,配置环境变量;
2、在环境变量中配置,CXF_HOME 值为apache-cxf-2.6.2地址。例如我的地址为E:\maxm\cxf\apache-cxf-2.6.2;
3、在PATH中加入%CXF_HOME%\bin。
4、需要生成客户端代码的.wsdl文件
5、打开cmd命令行,进入apache-cxf-2.6.2的bin目录下
6、执行命令:wsdl2java -p com -d xxxx -client xxxxx.wsdl,执行完毕后,会在目标位置生成webservice的客户端代码。

wsdl2java用法
(1)-p 指定其wsdl的命名空间,也就是要生成代码的包名;
(2)-d 指定要产生代码所在目录;
(3)-client 生成客户端测试web service的代码;
(4)-server 生成服务器启动web service的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值