1. 远程调用技术

2. WebService 概述

  • WebService 是使用 Http 发送 SOAP 协议数据的一种远程调用技术;
  • WebService 需要开发客户端;
  • WebService 需要开发服务端;
  • SOAP,简单对象访问协议,用来描述传递信息的格式;
  • WSDL,WebService 服务端的一个使用说明书,用来描述接口,方法,参数和返回值;
  • UUDI,用来管理,分发,查询WebService;

3. WebService 入门程序(基于JDK 1.7)

// 需求:
// 服务端: 发布一个天气查询服务,接收客户端城市名,返回天气数据给客户端;
// 客户端: 发送城市名称给服务端,接收服务端的返回天气数据; // 服务端
// 第一步: 创建 SEI(Service Endpoint Interface) 接口, 本质上就是 Java 接口;
public interface WeatherInterface{
public String queryWeather(String cityName);
} // 第二步: 创建 SEI 实现类 // @WebService 表示该类是一个服务类,需要发布其中的 public 方法
@WebService
public class WeatherImpl implements WeatherInterface{
public String queryWeather(String cityName){
System.out.println("from client..."+cityName);
String weather = "晴";
return weather;
}
} // 第三步: 发布服务
// 相当于 天气服务端
public class WeatherServer{
public static void main(String[] args){
// 使用 Endpoint 发布服务
// Endpoint.publish(address,implementor);
// address: 服务地址;
// implementor: 实现类
Endpoint.publish("http://127.0.0.1:12345/weather",new WeatherImpl());
}
} // 第四步: 测试服务是否发布成功. 通过阅读使用说明书,确定客户端调用的接口,方法,参数和返回值存在,
// 证明服务发布成功.
// WSDL 地址: 服务地址 + "?wsdl";

3.1 WSDL 阅读方式

  1. 从下往上阅读,先找到 service 标签,根据 service 标签里面的 binding 属性找到 binding 标签,

    然后查找 binding 标签中的 type 属性,根据该属性,查找 portType 标签;

// 客户端开发
// 第一步: wsimport 命令生成客户端代码
// 根据 wsdl 地址生成客户端代码, "."表示在当前目录下生成
wsimport -s . http://127.0.0.1:12345/weather?wsdl // 第二步: 根据使用说明书,说明客户端代码调用服务端
// 客户端
public class WeatherClient{
public static void main(String[] args){
// 创建服务视图, 视图是从 service 标签的 name 属性获取
WeatherImplService wis = new WeatherImplService(); // 获取服务实现类, 实现类是从 portType 标签的 name 属性获取
WeatherImpl weatherImpl = wis.getPort(WeatherImpl.class); // 调用查询方法,portType 标签的子标签 operation 中的 name 属性获取
String weather = weatherImpl.queryWeather("北京");
System.out.println(weather);
}
}

3.2 WebService 的优缺点

  1. 优点:

    • 跨防火墙: webservice 发送方式采用 http 的POST发送,http的默认端口是 80,防火墙默认不拦截 80;
    • 跨平台: webservice 使用XML格式封装数据,XML是跨平台的;
    • 支持面向对象;
  2. 缺点:
    • 采用 XML 格式封装数据,所以传输过程中,要传输额外的标签;
  3. 应用场景
    • 软件集成和复用:

      • 软件集成: 通过远程调用技术,将两个系统整合到一起,实现软件集成;
      • 软件复用: 同一款软件的多次集成,最终实现软件复用;

4. WSDL

4.1 概述

  • WSDL,网络服务描述语言;
  • 是一种使用XML编写的文档;
  • 是 webservice 服务端使用说明书,说明服务端接口,方法,参数和返回值;
  • 是随着服务发布成功,自动生成的,无需编写;

4.2 文档结构(从下往上阅读)

  • <service>: 服务视图,webservice的服务节点,它包括服务端点;
  • <binding>: 为每个服务端点定义消息格式和协议细节;
  • <portType>: 服务端点,描述 webservice 可被执行的操作方法,以及相关的消息,通过binding指向 portType
  • <message>: 定义一个操作(方法)的数据参数(可有多个参数);
  • <types>: 定义 webservice 使用的全部数据类型

5. SOAP

  • SOAP 即简单对象访问协议,是一种网络通信协议;
  • SOAP 用于跨平台应用程序之间的通信;
  • SOAP = XML + HTTP, 其实就是通过 HTTP 发 xml 数据;
  • SOAP 不是webservice的专有协议;

6. WebService 的两种客户端调用方式

6.1 公网服务地址: http://www.webxml.com.cn/zh_cn/web_services.aspx

6.2 第一种调用方式

  1. Wsimport 命令介绍

    • Wsimport 是 JDK 提供的一个工具,作用就是根据WSDL地址生成客户端代码;
    • 位置: JAVA_HOME/bin;
    • 仅支持SOAP1.1客户端的生成;
    • 常用参数:
      • -s,用于生成 java 文件的;
      • -d,用于生成 class 文件的,默认的参数;
      • -p,指定包名的,如果不加该参数,默认包名就是WSDL文档中命名空间的倒序;
  2. 调用公网手机号归属地查询服务

// 第一步: wsimport 生成客户端代码
// 存储在 cn.itcast.mobile 包下
wsimport -p cn.itcast.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx\?wsdl // 第二步: 根据使用说明书,说明客户端代码调用服务端
public class MobileClient{
public static void main(String[] args){
// 1. 创建服务视图
MobileCodeWS mcw = new MobileCodeWS();
// 2. 获取服务实现类
MobileCodeWSSoap mcws = mcw.getPort(MobileCodeWSSoap.class);
// 3. 调用查询方法
String result = mcws.getMobileCodeInfo("1234567","");
System.out.println(result);
}
} // 第一种方式使用简单,但一些关键的元素在代码生成时,固定到生成代码中,不方便维护;

6.3 第二种方式: service 编程调用方式(标准开发方式)

public class ServiceClient{
public static void main(String[] args) throws IOException{
// 1. 创建WSDL的URL, 注意不是服务地址
URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); // 2. 创建服务名称
// 参数: namespaceURI, 命名空间地址
// localPart, 服务视图名
QName qname = new QName("http://WebXml.com.cn/","MobileCodeWS"); // 3. 创建服务视图
// 参数: wsdlDocumentLocation: wsdl 地址
// serviceName: 服务名称
Service service = Service.create(url,qname); // 获取服务实现类
MobileCodeWSSoap wcss = service.getPort(MobileCodeSSoap.class);
// 调用查询方法
String result = wcss.getMobileCodeInfo("1233455","");
System.out.println(result);
}
}

WebService 入门的更多相关文章

  1. RESTful WebService入门(转)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lavasoft.blog.51cto.com/62575/229206 REST ...

  2. RESTful WebService入门

    RESTful WebService入门   RESTful WebService是比基于SOAP消息的WebService简单的多的一种轻量级Web服务,RESTful WebService是没有状 ...

  3. WebService入门实例教程

    什么是WebService 通过使用WebService,您的应用程序可以向全世界发布信息,或提供某项功能,它是基于Web的服务,通过Web进行发布.查找和使用. WebService脚本平台需支持X ...

  4. JAVAEE——BOS物流项目07:WebService入门、apache CXF入门、基于CXF发布CRM服务

    1 学习计划 1.WebService入门 n 什么是WebService n 调用网络上的WebService服务 n SOAP和WSDL概念 n 基于JDK1.7发布一个简单的WebService ...

  5. webservice入门简介

    为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 webservice入门简介 1.什么是webservice? webservice是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓的远 ...

  6. RESTful WebService入门【转】

    ESTful WebService是比基于SOAP消息的WebService简单的多的一种轻量级Web服务,RESTful WebService是没有状态的,发布和调用都非常的轻松容易.   下面写一 ...

  7. WebService入门案例

    关于WebService的作用和好处,大家应该都了解.但如何在Asp.Net中添加Web Service等问题一直是新手朋友的一大难题.鉴于网上没有一个像样的实际案例,特将课程设计中运用到的WebSe ...

  8. Apache CXF Webservice入门

    1.步骤一览 关于CXF的介绍请移步官网.百科,这里仅供初次使用者入门. 2.步骤详情 2.1.环境准备 apache-cxf-3.0.0.zip下载 jdk1.7.0_51 Eclipse4.3.0 ...

  9. .NET WebService 入门

    以 前写博客最主要的就是不知道写什么东西,现在感觉能写点东西,就是感觉博客随笔的标题挺难取的,最近工作中刚好用到了WebService,刚好可以写一 篇博客.去年工作的时候自己也用到过,只是知道调用一 ...

随机推荐

  1. Cocos2d-x 3.1.1 Lua演示样例 ActionsProgressTest(进度条)

    Cocos2d-x 3.1.1 Lua演示样例 ActionsProgressTest(进度条) 本篇博客介绍Cocos2d-x中的进度条动画,进度条涉及以下几个重要的类和方法,笔者来给大家具体解说一 ...

  2. 【剑指offer】Q17:合并两个排序的链表

    def Merge(head1, head2): if head1 == None: return head2 if head2 == None: return head1 psuhead = Lis ...

  3. 【转】Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

    [转]Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性 Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

  4. 堆积木----vector防止内存超限

    蒜头君有 nn 块积木,编号分别为 11 到 nn.一开始,蒜头把第 ii 块积木放在位置 ii.蒜头君进行 mm 次操作,每次操作,蒜头把位置 bb 上的积木整体移动到位置 aa 上面.比如 11  ...

  5. deepin linux 15.3安装完eclipse启动报错An error has occurred.

    原因是系统中安装了jdk9 导致的. 卸载jdk9就可以了 $ java -version Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings ...

  6. Python List 中 Append 和 Extent 方法不返回值。

    Append: list的append 方法是没有返回值的,因此list 的引用L被置为空 结果也就自然是空了. 再看一个例子: append 跟extend方法的区别是什么呢? 其实这样看的就很清楚 ...

  7. 《Netty in action》目录修复版本分享

    最近阅读了Netty in action一书.深感外国友人的书籍编写能力强大.作者由简入深.精简描述了Netty的相关知识,如何使用等等. 本来想翻译一下的.尝试着翻译了一点之后.发现非常痛苦啊.ps ...

  8. Linux 设备驱动的固件载入

    作为一个驱动作者, 你可能发现你面对一个设备必须在它能支持工作前下载固件到它里面. 硬件市场的很多地方的竞争是如此得强烈, 以至于甚至一点用作设备控制固件的 EEPROM 的成本制造商都不愿意花费. ...

  9. 【Java】对文件或文件夹进行重命名

    在Java中,对文件或文件夹进行重命名是很简单的,因为Java的File类已经封装好renameTo的方法. 修改文件或者文件夹的名字都使用这个方法.例如如下的程序: import java.io.* ...

  10. 小白用advanced installer建安装包

    写这篇文章的目的是由于肯定有人跟我一样非常小白,对安装包的构建又好奇.而我自己呢也要mark一下下,so--- 一.VS安装项目 首先关于安装包的构建,实用VS自带建安装项目的方式.网上有个中文工具叫 ...