WebService技术详解(⼀)WebService
WebService简介
Web Service技术, 能使得运⾏在不同机器上的不同应⽤⽆须借助附加的、专门的第三⽅软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应⽤之间, ⽆论它们所使⽤的语⾔、 平台或内部协议是什么, 都可以相互交换数据。
简单的说,WebService就是⼀种跨编程语⾔和跨操作系统平台的远程调⽤技术。所谓跨编程语⾔和跨操作平台,就是说服务端程序采⽤java编写,客户端程序则可以采⽤其他编程语⾔编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运⾏。 远程调⽤,就是⼀台计算机的应⽤可以调⽤其他计算机上的应⽤。例如:⽀付宝,⽀付宝并没有银⾏卡等数据,它只是去调⽤银⾏提供的接⼝来获得数据。还有天⽓预报等,也是⽓象局把⾃⼰的系统服务以webservice服务的形式暴露出来,让第三⽅⽹站和程序可以调⽤这些服务功能。
WebService原理
XML,SOAP和WSDL就是构成WebService平台的三⼤技术 。
WebService采⽤Http协议来在客户端和服务端之间传输数据。WebService使⽤XML来封装数据,XML
主要的优点在于它是跨平台的。
WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采⽤XML格式封装,并增加了⼀些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。
WebService服务器端⾸先要通过⼀个WSDL⽂件来说明⾃⼰有什么服务可以对外调⽤。简单的说,WSDL就像是⼀个说明书,⽤于描述WebService及其⽅法、参数和返回值。 WSDL⽂件保存在Web服务器上,通过⼀个url地址就可以访问到它。客户端要调⽤⼀个WebService服务之前,要知道该服务的WSDL⽂件的地址。WebService服务提供商可以通过两种⽅式来暴露它的WSDL⽂件地址:
1.注册到UDDI服务器,以便被⼈查;
2.直接告诉给客户端调⽤者。
WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。
JAVA WebService规范
Java 中共有三种WebService 规范,分别是JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS。
(1)JAX-WS:
JAX-WS(Java API For XML-WebService)。早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(java API For XML-Remote Procedure Call)⽬前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC,⼆者最⼤的区别就是RPC/encoded 样式的WSDL,JAX-WS 已经不提供这种⽀持。JAX-RPC 的API 从JAVA EE5 开始已经移除,如果你使⽤J2EE1.4,其API 位于l.rpc.包。JAX-WS(JSR 224)规范的API 位于l.ws.包,其中⼤部分都是注解,提供API 操作Web 服务(通常在客户端使⽤的较多,由于客户端可以借助SDK ⽣成,因此这个包中的API 我们较少会直接使⽤)。
(2)JAXM&SAAJ:
JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,相当于Web 服务的服务器端,其API 位于ssaging.*包,它是Java EE 的可选包,因此你需要单独下载。
SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使⽤的API,为构建SOAP 包和解析SOAP 包提供了重要的⽀持,⽀持附件传输,它在服务器端、客户端都需要使⽤。这⾥还要提到的是SAAJ 规范,其API 位于l.soap.*包。
JAXM&SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相⽐之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码⽐较⿇烦,⽽JAX-WS 更加抽象,隐藏了更多的细节,更加⾯向对象,实现起来你基本上不需要关⼼SOAP 的任何细节。那么如果你想控制SOAP 消息的更多细节,可以使⽤JAXM&SAAJ。
(3)JAX-RS:
JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的⼀套Web 服务规范,由于推出的较晚,该规范(JSR 311,⽬前JAX-RS 的版本为1.0)并未随JDK1.6 ⼀起发⾏。
WebService⼊门案例
服务端的实现
我们来实现⼀个天⽓系统的案例,客户端发送城市名称,服务器端回应相应的天⽓。
1.编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中就是普通接⼝
public interface WeatherInterface {
public String queryWeather(String cityName);
}
2.编写SEI实现类,此类作为webservice提供服务类
@WebService//@WebService表⽰该类是⼀个服务类,需要发布其中的public的⽅法
public class WeatherInterfaceImpl implements WeatherInterface {
@Override
public String queryWeather(String cityName) {
System.out.println("获取城市名"+cityName);
String weather="暴⾬";
return weather;
}
}
3.第三步:发布服务,Endpoint类发布服务,publish⽅法,两个参数:1.服务地址;2.服务实现类
public class WeatherServer {
public static void main(String[] args) {
Endpoint.publish("127.0.0.1:12345/weather", new WeatherInterfaceImpl());
}
}
4.测试服务是否发布成功,通过阅读wsdl,确定客户端调⽤的接⼝、⽅法、参数和返回值存在,证明服务发布成功
//我们在浏览器输⼊ 127.0.0.1:12345/weather?wsdl 来获取wsdl⽂件进⾏阅读
//wsdl,是以XML⽂件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使⽤或是调⽤这个服务.
//现在我们还不知道怎么去阅读,后⾯我们会详解,只要能获取到,就能确定WebService服务发布成
客户端的实现
//客户端调⽤服务有很多种⽅法,我们先⽤⼯具⽣成客户端代码,后⾯会详解
//wsimport是jdk⾃带的webservice客户端⼯具,可以根据wsdl⽂档⽣成客户端调⽤代码(java代码).当然,
⽆论服务器端的WebService是⽤什么语⾔写的,都可以⽣成
1.创建⼀个客户端空项⽬,cmd命令⾏进⼊此项⽬的src⽬录
使⽤以下命令⽣成客户端代码
wsimport -s . 127.0.0.1:12345/weather?wsdl调用webservice服务
-s是指编译出源代码⽂件,后⾯的.(点)指將代码放到当前⽬录下.
最后⾯的http….是指获取wsdl说明书的地址
2.编写客户端
public class WeatherClient {
public static void main(String[] args) {
//创建服务视图,视图是从wsdl⽂件的service标签的name属性获取
WeatherInterfaceImplService weatherInterfaceImplService=new WeatherInterfaceImplService();
//获取服务实现类,实现类从wsdl⽂件的portType的name属性获取
WeatherInterfaceImpl Port(WeatherInterfaceImpl.class);
//获取查询⽅法,从portType的operation标签获取
String weather=weatherInterfaceImpl.queryWeather("北京");
System.out.println(weather);
}
}
⾄此,我们的客户端就可以获取远程服务端的数据,接下来我们来详解⼀下各个部分。
WSDL
WSDL(Web Services Description Language), web服务描述语⾔,他是webservice服务端使⽤说明书,说明服务端接⼝、⽅法、参数和返回值,WSDL是随服务发布成功,⾃动⽣成,⽆需编写。
⽂档结构
Service:相关端⼝的集合,包括其关联的接⼝、操作、消息等。
Binding:特定端⼝类型的具体协议和数据格式规范
portType: 服务端点,描述 web service可被执⾏的操作⽅法,以及相关的消息,通过binding指向portType
message: 定义⼀个操作(⽅法)的数据参数
types: 定义 web service 使⽤的全部数据类型
阅读⽅式
WSDL⽂档应该从下往上阅读。
1.先看service标签,看相应port的binding属性,然后通过值查上⾯的binding标签。
2.通过binding标签可以获得具体协议等信息,然后查看binding的type属性
3.通过binding的type属性,查对应的portType,可以获得可操作的⽅法和参数、返回值等。
4.通过portType下的operation标签的message属性,可以向上查message获取具体的数据参数信息。
SOAP
SOAP即简单对象访问协议,他是使⽤http发送的XML格式的数据,它可以跨平台,跨防⽕墙,SOAP不是webservice的专有协议。
SOAP=http+xml
SOAP结构
必需的 Envelope 元素,可把此 XML ⽂档标识为⼀条 SOAP 消息
可选的 Header 元素,包含头部信息
必需的 Body 元素,包含所有的调⽤和响应信息
可选的 Fault 元素,提供有关在处理此消息所发⽣错误的信息
我们来看⼀下我们上⾯天⽓程序发送的数据的格式,这需要⼀个⼯具TCP/IP Monitor ,Eclipse⾃带的Debug⼯具之⼀,⽤于捕获Http、TCP/IP协议包。原理是⼀个代理服务,客户端先把数据发送到代理服务,然后代理服务再把数据发送到服务器,这样就能获取请求数据和响应数据。
第⼀步:打开这个⼯具,选择other,然后输⼊TCP/IP Monitor
第⼆步:设置要代理的服务器
第三步:详细设置
第⼀个参数是代理服务器端⼝,我们设置为54321
第⼆个参数是被代理服务器的地址,第三个参数是被代理服务器的端⼝
第四个参数要选择为TCP/IP

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。