1 WebService 介绍
- Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。
- Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
- Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
2 Webservice 的标准和实现方式
2.1 标准
- 采用标准SOAP(Simple Object Access Protocol) 协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输是xml数据。
- soap协议就是定义xml的标签格式
2.2 实现方式
- 采用wsdl(Web Services Description Language)作为描述语言【即webservice接口使用说明书】wsdl属w3c标准。
- xml是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。
- XSD,W3C为webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。
WebService数据传输的方式
- SOAP:http+xml
- Http rest :一套用来创建Web Service的方法,REST式的Web Service使用HTTP里的方法:GET,POST,DELETE, PUT
- http自定义数据协议:比如http传输json数据,http传输xml数据等
2.3 WebService 三要素
2.3.1 soap
- SOAP即简单对象访问协议(Simple Object Access Protocal) 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息.
- 简单理解为soap=http+xml,就是通过HTTP发xml数据
- Soap协议版本主要使用soap1.1、soap1.2。
- SOAP不是webservice的专有协议,其他应用协议也使用soap传输数据。例如,SMTP。
2.3.2 Wsdl
WSDL 是基于 XML 的用于描述Web Service及其函数、参数和返回值。通俗理解Wsdl是webservice的使用说明书
2.3.4 Uddi【了解】
- UDDI 是一种目录服务,通过它,企业可注册并搜索 Web services。企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册的web service服务,从而达到资源共享。
- UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。
- 目前大部分企业使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice
3 Webservice 开发规范
JAVA 中共有三种 实现WebService 开发规范JAX-WS(JAX-RPC)
、JAXM & SAAJ
、JAX-RS
3.1 JAX-WS 概述
JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(Java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代。
- 从jdk1.5开始支持JAX-WS2.0版本,
- Jdk1.6.0_13以后的版本支持2.1版本,
- jdk1.7支持2.2版本。
- 也就是说java提供了一个jar包来实现webservice
3.2 JAXM&SAAJ概述
- JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API
- SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输等
- JAXM & SAAJ 与JAX-WS 都是基于SOAP 的Web 服务
- 相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦
- 而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节【开发者更喜欢这种方式开发webservice】
3.3 JAX-RS 概述
JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范
由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。
4 JAX-WS
4.1 Webservice案例
提供一个天气的WebService服务器接口
- 创建一个SEI(Service Endpoint Interface)接口,本质就是一个Weather接口
package com.tzb.weather;
public interface WeeatherInterface {
public String queryWeather(String cityName);
}
- 实现天气接口,在类上添加
@Webservice
注解
package com.tzb.weather.impl;
import com.tzb.weather.WeeatherInterface;
import javax.jws.WebService;
@WebService
public class WeatherInterfaceImpl implements WeeatherInterface {
@Override
public String queryWeather(String cityName) {
if ("北京".equals(cityName)) {
return cityName + ": 晴天";
}
return null;
}
}
- 使用Endpoint的publish发布一个WebService服务
public static void main(String[] args) {
// 1.写服务接口
// 2.添加 webservice 注解
// 3. 发布服务
Endpoint.publish("http://127.0.0.1:12345/weather",new WeatherInterfaceImpl());
}
浏览器访问
4.2 wsdl说明书结构
<service>
服务视图,webservice的服务结点,它包括了服务端点<binding>
为每个服务端点定义消息格式和协议细节<portType>
服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType<message>
定义一个操作(方法)的数据参数(可有多个参数)<types>
定义 web service 使用的全部数据类型
4.3 wsdl 说明书阅读方式
从下往上读,先找到服务视图,通过binging找到protType,找到了protType就找到了我们要调用的webservice方法。
4.4 Wsimport命令
- wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice。
- wsimport.exe位于JAVA_HOME\bin目录下.
- 常用参数为:
-s<目录> - 将生成.java文件。(学习)
-d<目录> - 将生成.class文件。默认参数。
-p<生成的新包名> -将生成的类,放于指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必须的参数。
示例:
C:/> wsimport –s . http://127.0.0.1:1234/weather?wsdl
注意:-s不能分开,-s后面有个小点
4.5 案例:通过Wsimport生成客户端调用类
4.6 案例:WebService 客户端编写
public static void main(String[] args) {
// 创建服务窗口
WeatherInterfaceImplService service = new WeatherInterfaceImplService();
// 找到服务端点
WeatherInterfaceImpl port = service.getPort(WeatherInterfaceImpl.class);
// 调用webservice 方法
String weatherInfo = port.queryWeather("北京");
System.out.println(weatherInfo);
}