Java WSDL 服务调用入门分享
第一次自己使用代码直接调用webservice。对于这种网上很难找资料,而且找到了不会用,会用但是会报错的代码。内心是非常痛苦的。要静下心来仔细学习webservice也是不可能的,因为非常赶。所以就把我终于学会调用webservice的关键过程写下
webservice说明
此为不专业的说明,仅做了解用。且代码都是从片段里面截取出来的,仅供思路参考,不能直接拿来用。
webservice应该就是想用于跨平台的交互方式,因为在它复杂的xml里面,规定了调用的方式,参数的对象(强类型)等等信息。而WSDL(Web Services Description Language)应该就是一种针对webservice更加详细的约定,因为WSDL描述了webservice的函数、参数、返回值等说明。
如何调用
自己写调用代码,我不会,只能祈祷大家以后对接能少遇到webservice- 使用CFX生成。下面我讲一下如何使用cfx生成可以直接调用的代码,以及如何调用。
CFX生成可直接调用的代码1
思路如下:下载插件 -> 根据给出的xml生成对应的代码 -> 在代码里面找到main方法 -> 模仿main方法自己去调用 -> 封装让接口更加易用
下载cfx的软件。http://mirrors.tuna.tsinghua.edu.cn/apache/cxf/3.3.3/apache-cxf-3.3.3.zip
解压后,打开bin文件夹,找到我们需要运行的 wsdl2java
-
在bin文件夹,打开CMD。输入命令:
wsdl2java -p 这里填写你的包名 -d 这里填写你生成代码的位置 -client -encoding utf-8 -noAddressBinding 这里填写WSDL的地址
你的包名:指的是接下来生成的文件会在XX.XX包下面。比如:我填写的是
com.google
,那么生成的文件结构如此:package com.google.test;
代码的位置:指的是生成的文件会在XXX路径下面。比如:我填写的是
C:\Users\shihu\Documents\wsdl
,那么生成的文件就会在C:\Users\shihu\Documents\wsdl
文件下。WSDL的地址:指的是你将要调用的wsdl的地址,一般就是返回一个xml文件。比如:我填写
http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl
,那么就是根据该地址返回的xml文件去生成代码。这里我挑选了亚马逊的测试例子。这里有更多的例子,只需要将地址替换即可。所以,完整的命令可以如下:
wsdl2java -p com.google -d C:\Users\shihu\Documents\wsdl -client -encoding utf-8 -noAddressBinding http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl
生成以后的目录结构如下非常多文件,但是别怕[下面会大致说明](#anchor1)<sup>注1</sup>:
```bash
C:.
└─com
└─google
Accessories.java --dom实体
Arguments.java --dom实体
AWSECommerceService.java --webservice 的service
AWSECommerceServicePortType.java --可以获取webservice入口的
AWSECommerceServicePortType_AWSECommerceServicePortCA_Client.java --入口
AWSECommerceServicePortType_AWSECommerceServicePortCN_Client.java --入口
AWSECommerceServicePortType_AWSECommerceServicePortDE_Client.java --入口
AWSECommerceServicePortType_AWSECommerceServicePortES_Client.java --入口
...
-
导入并运行代码
面对这些陌生的代码,我们该如何着手?很简单,找到入口(main方法)就可以。
- main方法在**Endpoint_Client **结尾的文件里面;里面自动生成了所有服务端提供的方法。我们只需要调用一下main方法就可以帮我们调试所有的接口了。
- 然后我们模仿main方法,自己将service实例化出来,就可以直接调用服务端接口了。
额外产物
将返回的数据转化为json
返回之后的是一个dom数据,那么我们如何把他转化为JSON对象呢?
返回的实体大致如下:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"username",
"password"
})
@XmlRootElement(name = "login")
public class Login {
@XmlElementRef(name = "username", namespace = "http://sys.ws.xxx.com", type = JAXBElement.class, required = false)
protected JAXBElement<String> username;
@XmlElementRef(name = "password", namespace = "http://sys.ws.xxx.com", type = JAXBElement.class, required = false)
protected JAXBElement<String> password;
...
如果你和我情况类似,那么你可以使用以下方法转化为JSON。我封装了2部分,一个是只转化一个,另外一个是转化集合的。其实本质都是一样的。最主要的代码是final String json = mapper.writerWithDefaultPrettyP