什么是 Web service
到目前为止对 Web service 没有统一的定义,这里以一种更容易理解的方式解释。Web service 是一个平台独立的,低耦合的,自包含的、基于可编程的 web 的应用程序,即是一种跨编程语言和操作系统平台的远程调用技术。
Web service 技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互通信。Web service 可以使你的网站使用其他网站的资源,比如在网页上显示天气、地图的最新动态等等。
本地服务的缺陷
“网络服务”是软件开发和使用的趋势,本地服务将越来越少,主要有以下几个原因:
1.本地资源不足。很多数据和资料,本地得不到,只有向其他网站要。
2.成本因素。本地提供服务,往往是不经济的,使用专业网站的服务更便宜。这里面涉及硬件和人员两部分,即使你买得起硬件,专门找一个人管理系统,也是很麻烦的事。
3.可移植性差。如果你想把本机的服务,移植到其他机器上,往往很困难,尤其是在跨平台的情况下。
Web service 的优势
1.自包含。意思是客户端不需要包含任何附加的软件或硬件,只要客户端支持 Http 和 XML 就可以完成数据的交换或集成。
2.跨平台与跨语言。无论你使用哪种语言,只要遵循 Web service 的规范就可以互相调用。
3.通过网络进行发布,查找和使用,并且不需要考虑客户端兼容问题,一次性就能完成。
4.可以实现多数据与多种服务聚合。
WSDL(Web services Description Language)Web services 描述语言。一个 XML 格式文档,用以描述服务端口访问方式和使用协议的细节。通常用来辅助生成服务器和客户端代码及配置信息。
SOAP(Simple Object Access Protocol)简单对象访问协议。它是一种标准化的通讯规范,主要用于 Web 服务 (Web service) 中。这种规范基于两个我们熟知的协议:HTTP 和 XML。
UDDI(Universal Description, Discovery, and Integration)一个用来发布和搜索 WEB 服务的协议,应用程序可借由此协议在设计或运行时找到目标 WEB 服务。这些标准由这些组织制订:W3C 负责 XML、SOAP 及 WSDL;OASIS 负责 UDDI。
Java 的原生 JDK 对 Web service 作了支持,下面我们通过服务端 (可以理解为其他服务器上的资源) 与客户端 (本地调用) 的实现来模拟中间的调用过程。
服务端
服务端项目目录结构 (最基本的 Java Project):
服务端资源接口WeatherService
:
/**
* 添加@WebService 注解,表明这是一个 Web service 服务
**/
@WebService
public interface WeatherService {
/**
* 根据城市名字获得对应的天气信息
*
* @param cityName
* @return
*/
@WebMethod
String getWeatherInfoByCityName(String cityName);
}
服务端资源接口实现类WeatherServiceImpl
:
@WebService(endpointInterface= "com.jas.websevice.server.WeatherService")
public class WeatherServiceImpl implements WeatherService {
@Override
public String getWeatherInfoByCityName(String cityName) {
if("北京".equals(cityName)){
return "晴";
} else if ("上海".equals(cityName)) {
return "小雨";
}
return "查询不到对应的天气信息";
}
}
服务端开启服务:
public class ServerTest {
public static void main(String[] args) {
/**
* 第一个参数是服务发布的地址
* 第二个参数是设置对应的服务类,注意是接口的实现类
* 配置完成后直接运行该程序即可
*/
Endpoint.publish("http://localhost:8080/weather", new WeatherServiceImpl());
}
}
当开启服务后我们可以使用 WSDL 来查看服务端的配置信息,只需要在浏览器输入http://localhost:8080/weather?wsdl
即可访问,http://localhost:8080/weather
是我们在上面设置的服务发布地址。
上面这个 XML 的格式文档中描述了服务端口访问方式和使用协议的细节,但是只依靠这个文档是不能完成服务调用的,上面我们也提到了可以根据这个文档来生成客户端的代码。在配置了 jdk 环境变量的情况下,我们可以使用wsimport
命令把上面的文档信息生成 Java 代码。
客户端
首先先创建一个普通的 Java 工程,在命令模式下进到新建 Java 工程的src
目录下,执行wsimport -s . http://localhost:8080/weather?wsdl
,其中 -s .
表示把代码生成在当前的目录。生成代码的过程中,会把包名也连带一起生成。
根据客户端生成的代码我们就可以调用服务端的服务了 (服务端的程序在开启的情况下)。
public class ClientTest {
public static void main(String[] args) {
WeatherServiceImplService factory = new WeatherServiceImplService();
// 为 WeatherService 生成代理对象
WeatherService weatherService = factory.getWeatherServiceImplPort();
// 调用 WeatherService 代理对象的方法来获得对应的天气信息
String weatherInfo = weatherService.getWeatherInfoByCityName("上海");
System.out.println(weatherInfo);
}
}
PS:贴出一点好玩的,大家可以通过http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
链接文档生成客户端代码,可以查询手机号码的归属地信息,有兴趣的可以尝试一下。
到这里我们应该知道什么是 Web service 了,服务端与客户端可以是两个不同的工程,不管使用什么语言与什么平台 (PS:上面这个例子使用的都是 Java),它们之间都可以通过 HTTP 协议进行通信。因此你可以用任何你喜欢的语言,在任何你喜欢的平台上写 Web service ,只要我们可以通过 Web service 标准对这些服务进行查询和访问即可。
参考资料:
http://www.cnblogs.com/Leo_wl/archive/2010/05/20/1740205.html
http://www.ruanyifeng.com/blog/2009/08/what_is_web_service.html
http://blog.csdn.net/feinifi/article/details/77780151