之前写了一篇博客,是使用cxf搭建webservice的客户端和服务端(暂时还没写完),突然意识到如果自己上手就学框架,似乎是一个不明智地做法,于是打算从头开始,先把框架放一边,学着用一些基础地知识完成webservice的操作,因为我一开始学webservice的目的,是想通过官方给的wsdl,查到自己城市公交车的实时位置,所以本文是以如何搭建客户端为主写的,至于服务端的搭建,暂时还不是我所面临的主要矛盾,所以先搁置在一边。正文开始......
webservice 服务端的搭建
步骤概要
0、 生成客户端代码wsimport
1、 查看服务说明书wsdl
2、 按照服务说明书进行编程,找关键节点
关键节点
wsdl内容 | 作用 |
---|---|
<service name="{service_name}"> | 创建{service_name}对象 |
<portType name="{portType_name}"> | 实现类的名称 |
<portType>标签下面的<operation name="{operation_name}"> | 这里的operation_name就是方法 |
具体步骤
零、生成客户端程序
生成客户端程序需要使用命令wsimport -s . {url}
注意此命令需要在需要创建客户端的文件内打开,如在eclipse中的src目录下,进入cmd或者Powershell,才能使用该命令在正确的地方创建好客户端代码
url中的内容为wsdl文件的绝对路径,包括来自于互联网的位置或者是本地绝对地址
举例说明:
0、先在eclipse中新建项目
1、在本地打开src文件夹
注意点击此按钮之后,需要双击src文件夹,才能进入src文件夹
2、按住shift加鼠标右键,打开Powershell
3、输入wsimport
命令,此处采用一个网站提供的wsdl为例,此service的作用是查询手机号归属地,地址:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL
此地址来自于webxml官网,官网链接:http://www.webxml.com.cn/zh_cn/index.aspx
解析成功
Warning可以忽略
4、观察src文件夹下,出现了相关目录,在eclipse中观察需要刷新
5、新建一个package,此处采用的是在原包后加“.client”构建新的包,并新建Client.class文件,此处命名可以随意
一、查看wsdl服务说明书
观察wsdl文件,发现其本质上是一个xml文件,找到它们的关键标签,注意wsdl文件推荐从下往上读
1、找<service name="{service_name}">
2、找<portType name="{portType_name}">,此处找使用soap协议的portType
3、找<portType>标签下面的<operation name="{operation_name}">
二、进行编程
此处代码非常简单,一般而言有两种方式,这里仅仅记录推荐的一种方式
package cn.com.webxml.client;
import cn.com.webxml.MobileCodeWS;
import cn.com.webxml.MobileCodeWSSoap;
public class Client {
public static void main(String[] args) {
// 1、创建服务视图
MobileCodeWS service = new MobileCodeWS();
// 2、根据服务视图创建实现类对象
MobileCodeWSSoap port = service.getPort(MobileCodeWSSoap.class);
// 3、调用方法, 这里可以传递参数
String mobileCodeInfo = port.getMobileCodeInfo("13333333333", null);
System.out.println(mobileCodeInfo);
}
}
具体传何参数,由官网的说明书给出
地址:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo
最后测试
说明:有时会遇到使用wsimport
生成客户端出错的现象,这主要是由于wsdl中的某几行不符合自动生成的规范,需要我们将整个wsdl文件复制到本地,保存为wsdl格式文件,将其中的<s:any/> </s:sequence>
改成<s:any minOccurs="2" maxOccurs="2"></s:any>
如图:
改成
再将来自网络的url改成本地的绝对路径,就可以使用wsimport
生成客户端代码了