WebService介绍与java调用WebService方法两种方式介绍
WebService相关术语介绍
- SOAP (Simple Objext Access) 简单对象访问协议
- WASDL (Web Service Definition Language) web服务语言与结构分析
- UDDI(Universal Description Discovery Integration) 统一描述发现和集成
WebService主要解决问题
- 不同系统、不同平台、不同语言之间的通信访问和调用
- 应用程序的集成,不同业务的整合
WebService应用
- QQ中的天气预报
- 淘宝中可以查看第三方快递信息,比如查看中通快递信息
java调用WebService两种方式
方式一,需要下载客户端代码
步骤
以调用第三方天气接口为例:
天气接口地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
Step1: 打开项目文件目录路径文件夹,在当前文件夹打开cmd,其中exam是项目包目录
,输入
wsimport -keep -p exam -verbose
Step2: 如果遇到如下错误:
用浏览器打开:天气接口地址http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
ctrl+s保存文件为weather.wsdl。用编辑器打开下载的文件,将
<s:element ref="s:schema" /> <s:any />
修改成
<s:any minOccurs="2" maxOccurs="2" />
Step3:打开保存的文件路径输入cmd,输入
wsimport -s . weather.wsdl
生成的文件
文件内容:
Step4,测试java调用webservice天气接口
测试代码
public class Test {
public static void main(String[] args) throws MalformedURLException {
// URL url=new URL("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl");
// WeatherWebService ws = new WeatherWebService(url);
WeatherWebService ws = new WeatherWebService();
//WeatherWebServiceSoap为调用的实现类
WeatherWebServiceSoap wsSoap = ws.getWeatherWebServiceSoap();
ArrayOfString aos = null;
aos = wsSoap.getWeatherbyCityName("西安");
System.out.println(aos.getString());
}
}
测试结果
方式二,直接调用
步骤
Step 1.导入依赖
<!--webservice-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.5</version>
</dependency>
Step 2.测试代码
public class WebServiceTest {
private static final AriesJcLogger logger = AriesJcLoggerFactory.getLogger(WebServiceTest.class);
/**
* 调用webservice接口
*/
public String sendWsdl() {
logger.info("--------调用webservice接口begin-------");
// 创建动态客户端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//对方的wsdl地址
// Client client = dcf.createClient("http://xx .xxx.xx.xx:9556/xxx/ws/getAlarmWs?wsdl");
// Client client = dcf.createClient("http://10.195.246.151:8123/SynTime?wsdl");
// String wsdl = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
String wsdl = "F:\\IDEA_Project\\练习\\exam\\weather.wsdl";
logger.info("wsdl地址:{}", JsonUtil.toJson(wsdl));
Client client = dcf.createClient(wsdl);
String json = null;
try {
String targetNameSpace = "http://WebXml.com.cn/";
String methodName = "getWeatherbyCityName";
logger.info("目的地址:{}",JsonUtil.toJson(targetNameSpace));
logger.info("方法名称:{}",JsonUtil.toJson(methodName));
QName qName = new QName(targetNameSpace, methodName);
// QName qName = new QName("http://tempuri.org/ns.xsd/Service.wsdl", "SynTime");
// URL wsdlLocation = new URL("http://10.195.246.151:8123");
// Service service = Service.create(wsdlLocation, qName);
//Object[] objects1= client.invoke(qName, "aaa","bbb"); //参数1,参数2,参数3......按顺序放就看可以
// Object[] objects1= client.invoke(qName, ""); //参数1,参数2,参数3......按顺序放就看可以
logger.info("调用方法:{}",JsonUtil.toJson(qName));
String cityName ="西安";
logger.info("参数列表:{}",JsonUtil.toJson(cityName));
Object[] objects1= client.invoke(qName,cityName); //参数1,参数2,参数3......按顺序放就看可以
json = JsonUtil.toJson(objects1[0]);
System.out.println("返回数据:" + json.toString());
} catch (Exception e) {
e.printStackTrace();
logger.info("服务器断开连接,请稍后再试",e);
}
logger.info("--------调用webservice接口end-------");
return json;
}
public static void main(String[] args) {
WebServiceTest wt = new WebServiceTest();
String s = wt.sendWsdl();
System.out.println(s);
}
}
如果遇到如下错误:
需要将方式一中的 weather.wsdl保存到本地,修改wsdl地址为如下:
String wsdl = "F:\\IDEA_Project\\练习\\exam\\weather.wsdl";