目前项目里有使用到webservice,之前有对webservice进行了解过,但是懂得的不多,我们来一起看看它吧,正式学习它之前我们来提出java3问(是什么?有什么用?怎么用?)
是什么:
一句话来说,webservice就是一种跨编程语言和跨操作系统平台的远程调用技术。
webservice的客户端和服务端可以是不同语言的,也可以在不同的操作系统之间进行使用,远程调用是指一台机器上A系统可以调用另一台机器上的B系统,例如:我们平时有些app会提示天气预报的功能,这些个app背后的公司总不可能各自开发自己的天气预报系统,这样成本太大,所以他们普遍调用气象局的天气服务系统。
webservice中主要四种技术——XML、WSDL、SOAP、UDDI。在一套完整的Webservice服务中,这四种技术各有其自己的实现价值,下面分别来介绍一下各自的用途
1.XML
XML是用来标记数据的(对于XML标签详细介绍,可以参考W3C),因为上面我们说过,webservice不依赖于某一门特定的编程语言。而不同的系统可能是使用不同的编程语言来开发,(如上:项目A使用PHP开发,项目B使用Java开发)所以说就需要一种方式来交换数据,这种方式同样不依赖于某种编程语言,大多数软件都集成了XML标签,因此使用XML格式的数据来实现数据的交换。
2.SOAP
SOAP是一种特殊的协议,用来传输数据。当调用方一旦发现提供Webservice接口的地址,它将会使用SOAP协议和提供Webservice的系统进行连接。
3.WSDL
WSDL用来描述客户端可以调用的接口的规则,所有这些规则定义在WSDL文件中,当有客户端发起调用的时候,Webservice提供方会参考这个WSDL规则来验证数据请求的合法性。
4.UDDI
UDDI列出了那些服务是可以被访问的。当一个系统需要数据的时候,首先它会先查找UDDI,找出从除了自己之外的那些可以获取到自己需要的数据的服务,然后进行链接获取数据。这一点有点类似于DNS的功能。
有什么用:
有什么用处,其实在说是什么的时候有点到,主要就是借助这个技术实现各系统间方法的调用。例如在一家公司中,可能java编写的ERP系统需要调用C++编写的CRM系统的某些功能,这时候就需要webservice。
怎么用:
webservice开发有三种方式:jdk,cxf和axis,目前cxf的使用根据网络了解比axis高出50%,所以本系列文章介绍jdk和cxf两种方式。先介绍jdk开发方式:
服务端:
- 首先创建webservice的服务端:
package com.ljm.server.webservice;
import java.io.UnsupportedEncodingException;
import javax.jws.WebService;
/**
* Created by linjiaming
*/
@WebService
public class WeatherServiceImpl implements IWeatherService {
@Override
public String query(String cityName) throws UnsupportedEncodingException {
//乱码:原本的编码方式为utf-8,客户端传输参数传输过程中,被错误的转成GBK后又被转为UTF-8
System.out.println("查询"+new String(cityName.getBytes("GBK"),"UTF-8"));
return "大晴天";
}
}
- 发布服务
package com.ljm.server.main;
import com.ljm.server.webservice.WeatherServiceImpl;
import javax.xml.ws.Endpoint;
/**
* @author linjiaming
* JDK方式发布服务
*/
public class WeatherServer {
public static void main(String[] args) {
//服务地址和服务的实现
Endpoint.publish("http://localhost:8080/weatherService", new WeatherServiceImpl());
System.out.println("发布成功");
}
}
客户端:
- 判断服务端是否发布成功,首先在地址栏输入发布的地址:http://localhost:8080/weatherService加上?wsdl。看是否生成描述文档
- 创建客户端项目,定位到项目src地址,采用java命令生成客户端代码,或者采用ide自带的webservice客户端生成工具(本文采用的是idea自带的工具)
- java命令
-s . 指的是在当前路径,指令介绍可以使用wsimport -h 查看
2. idea工具生成
生成之后如下所示(已删除.class文件):
- 书写代码,调用服务
package com.ljm.main;
import com.ljm.webservice.WeatherServiceImpl;
import com.ljm.webservice.WeatherServiceImplService;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
/**
* Created by linjiaming
*/
public class WeatherClient {
/**
* 第一种方式调用方式
* @param args
*/
public static void main(String[] args) {
//创建服务视图
WeatherServiceImplService service = new WeatherServiceImplService();
//得到服务实现类
//WeatherServiceImpl port = service.getPort(WeatherServiceImpl.class);
WeatherServiceImpl weatherServiceImplPort = service.getWeatherServiceImplPort();
String s = weatherServiceImplPort.query("上海");
System.out.println(s);
}
/**
* 第二种调用方式
* @param args
*/
/* public static void main(String[] args) throws MalformedURLException {
//wsdl描述文档
URL url = new URL("http://localhost:8080/weatherService?wsdl");
//服务名
QName qName = new QName("http://webservice.server.ljm.com/", "WeatherServiceImplService");
Service service = Service.create(url, qName);
//得到服务实现
WeatherServiceImpl weatherService = service.getPort(WeatherServiceImpl.class);
String s = weatherService.query("上海");
System.out.println(s);
}*/
}
运行之后,观察控制台可知服务调用成功