Web service 介绍与简单应用

一、Web service 介绍

什么是 Web service

到目前为止对 Web service 没有统一的定义,这里以一种更容易理解的方式解释。Web service 是一个平台独立的,低耦合的,自包含的、基于可编程的 web 的应用程序,即是一种跨编程语言和操作系统平台的远程调用技术。

Web service 技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互通信。Web service 可以使你的网站使用其他网站的资源,比如在网页上显示天气、地图的最新动态等等。
Web service 介绍与简单应用_第1张图片

本地服务的缺陷

“网络服务”是软件开发和使用的趋势,本地服务将越来越少,主要有以下几个原因:

1.本地资源不足。很多数据和资料,本地得不到,只有向其他网站要。

2.成本因素。本地提供服务,往往是不经济的,使用专业网站的服务更便宜。这里面涉及硬件和人员两部分,即使你买得起硬件,专门找一个人管理系统,也是很麻烦的事。

3.可移植性差。如果你想把本机的服务,移植到其他机器上,往往很困难,尤其是在跨平台的情况下。

Web service 的优势

1.自包含。意思是客户端不需要包含任何附加的软件或硬件,只要客户端支持 Http 和 XML 就可以完成数据的交换或集成。

2.跨平台与跨语言。无论你使用哪种语言,只要遵循 Web service 的规范就可以互相调用。

3.通过网络进行发布,查找和使用,并且不需要考虑客户端兼容问题,一次性就能完成。

4.可以实现多数据与多种服务聚合。

Web service 三个核心定义
Web service 介绍与简单应用_第2张图片

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 原生 API 快速体验 Web service

Java 的原生 JDK 对 Web service 作了支持,下面我们通过服务端 (可以理解为其他服务器上的资源) 与客户端 (本地调用) 的实现来模拟中间的调用过程。

服务端

服务端项目目录结构 (最基本的 Java Project):
Web service 介绍与简单应用_第3张图片
服务端资源接口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是我们在上面设置的服务发布地址。
Web service 介绍与简单应用_第4张图片
上面这个 XML 的格式文档中描述了服务端口访问方式和使用协议的细节,但是只依靠这个文档是不能完成服务调用的,上面我们也提到了可以根据这个文档来生成客户端的代码。在配置了 jdk 环境变量的情况下,我们可以使用wsimport命令把上面的文档信息生成 Java 代码。

客户端

首先先创建一个普通的 Java 工程,在命令模式下进到新建 Java 工程的src目录下,执行wsimport -s . http://localhost:8080/weather?wsdl,其中 -s . 表示把代码生成在当前的目录。生成代码的过程中,会把包名也连带一起生成。
Web service 介绍与简单应用_第5张图片

客户端生成的代码:
Web service 介绍与简单应用_第6张图片

根据客户端生成的代码我们就可以调用服务端的服务了 (服务端的程序在开启的情况下)。

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

你可能感兴趣的:(Java,基础,分布式)