关于WebService的自我总结
今天在公司,出乎意料的要用到有点过时的WebService技术,但是自己原来从没接触过,所以经过自己百度找资料,在此总结!
1.WebService的发展史
近几年来,Internet的迅猛发展使其成为全球信息传递与共享的巨大的资源库。越来越多的网络环境下的Web应用系统被建立起来,利用HTML、CGI等Web技术可以轻松地在Internet环境下实现电子商务、电子政务等多种应用。然而这些应用可能分布在不同的地理位置,使用不同的数据组织形式和操作系统平台,加上应用不同所造成的数据不一致性,使得如何将这些高度分布的数据集中起来并得以充分利用成为急需解决的问题。
随着网络技术、网络运行理念的发展,人们提出一种新的利用网络进行应用集成的解决方案——Web Service。Web Service是一种新的Web应用程序分支,其可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。因此,Web Service是构造分布式、模块化应用程序和面向服务应用集成的最新技术和发展趋势。
2.WebService是什么?
Web service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。本质上就是服务提供方(服务端)发布一些服务到网络上,服务使用方(客户端)如果使用到该服务的功能,直接在网络上调用服务接口就可以了,无需自己重新开发。譬如,我们可以调用互联网上查询天气信息Web服务,然后把它嵌入到我们的程序(C/S或者B/S程序中),当用户从我们的网点看到信息时,他会认为我们为他提供了很多的服务信息,但其实我们什么也没有做,只是简单的调用了下服务器上的一段代码而已。如下图WebService的应用场景,它提供了信用服务,库存服务,账单服务,运送服务。
3.WebService技术
WebService发布后,服务是封装在一个wsdl(Web Service Description Language,Web服务描述语言)文件中,客户端发请求主要是向发布好的wsdl地址以SOAP方式发请求,调用过程如下:1.服务端生成服务描述文件,以供客户端获取。2.客户端取得服务端的服务描述文件,解析该文件从而获得服务端的服务信息以及调用方式。3.客户端指定调用方法和参数,生成恰当的SOAP请求消息,发往服务端,并等待服务端返回的SOAP回应消息。4.服务端接收客户端发来的SOAP请求消息,解析其中的方法调用和参数格式。并根据wsdl的描述,完成指定功能,将返回值放入SOAP回应消息返回给用户。 5.客户端解析得到的返回值。
WebService的三要素是: SOAP (Simple Object Access Protocol):简易对象访问协议,soap用来描述传递信息的格式。 WSDL (WebServices Description Language):Web服务描述语言,用来描述如何访问具体的接口。 UDDI (Universal Description Discovery and Integration):通用描述、发现及整合,用来管理、分发、查询WebService。
3.1 Soap
WebService通过HTTP协议发送请求和接收结果,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明 HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。SOAP协议 = HTTP协议 + XML数据格式
SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。
3.2 WSDL
好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方 法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受 的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。
WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的 Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。
WSDL 文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。 WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。
3.3 UDDI
UDDI,英文为 "Universal Description, Discovery and Integration",可译为“通用描述、发现与集成服务”,是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
例如行业发布了一个用于航班比率检测和预订的 UDDI 标准,航空公司就可以把它们的服务注册到一个 UDDI 目录中。然后旅行社就能够搜索这个 UDDI 目录以找到航空公司预订界面。当此界面被找到后,旅行社就能够立即与此服务进行通信。
4.WebService有哪些趋势?
1.内容更加动态:一个web service必须能合并从多个不同来源的内容,可以包括股票,天气,新闻等,在传统环境中的内容,如存货水平,购物订单或者目录信息等,都从后端系统而来;
2.带宽更加便宜:web services可以分发各种类型的内容(音频,视频流等);
3.存储更便宜::web services必须能聪明地处理大量数据,意味着要使用数据库,LDAP目录,缓冲,和负载平衡软件等技术保持可扩展能力;
4.普遍式计算更重要:web services不能要求客户使用某一版本的windows的传统浏览器,必须支持各种设备,平台,浏览器类型,各种内容类型;
要达到这样的目标,Web services要使用两种技术:
XML(标准通用标记语言下的一个子集):XML是在web上传送结构化数据的伟大方式,Web services要以一种可靠的自动的方式操作数据,HTML(标准通用标记语言下的一个应用)不会满足要求,而XML可以使web services十分方便的处理数据,它的内容与表示的分离十分理想;
SOAP:SOAP使用XML消息调用远程方法,这样web services可以通过HTTP协议的post和get方法与远程机器交互,而且,SOAP更加健壮和灵活易用;
其他像UDDI和WSDL技术与XML和SOAP技术紧密结合用于服务发现。
5.对WebService的理解
WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用.
我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单调用了一下服务器上的一段代码而已。
学习WebService可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样.。
6.自定义自定义webservice服务
我们自己写的web应用程序也是可以发布webservice的
我们发布了webservice的话,那么其他人也是可以调用我们自己写的webservice!
那么我们怎么自定义webservice然后发布出去呢???
在jdk 1.6 版本以后 ,通过jax-ws 包提供对webservice的支持
该方式通过注解的方式来声明webservice
通过 jdk EndPoint.publish()发布webserive服务
图片描述
快速入门
1.写一个实体
package java;
public class Phone {
private String name;//操作系统
private String owner;//拥有者
private int total;//市场占有率
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}
2.发布service,通过注解来让WSDL文件更加可读package cn.dzp.webservice.dd;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/*
*手机的业务类,该业务类通过webservice 对外提供服务
* 1\. 声明: @webservice
* 2\. 发布 EndPoint
*/
@WebService(serviceName="PhoneManager",//修改服务名
targetNamespace="http://dd.webservice.dzp.cn") //修改命名空间 ,默认包名,取反
//声明该业务类 对外提供webservice服务 ,默认只是对public 修饰的方法对外以webservice形式发布
public class PhoneService {
/**@WebMethod(operationName="getMObileInfo"): 修改方法名
* @WebResult(name="phone"):修改返回参数名
* @WebParam(name="osName"):修改输入参数名
*/
@WebMethod(operationName="getMObileInfo")
public @WebResult(name="phone")
Phone getPhoneInfo(@WebParam(name="osName")String osName){
Phone phone=new Phone();
if(osName.endsWith("android")){
phone.setName("android");phone.setOwner("google");phone.setTotal(80);
}else if(osName.endsWith("ios")){
phone.setName("ios");phone.setOwner("apple");phone.setTotal(15);
}else{
phone.setName("windows phone");phone.setOwner("microsoft");phone.setTotal(5);
}
return phone;
}
@WebMethod(exclude=true)//把该方法排除在外
public void sayHello(String city){
System.out.println("你好:"+city);
}
private void sayLuck(String city){
System.out.println("好友:"+city);
}
void sayGoodBye(String city){
System.out.println("拜拜:"+city);
}
protected void saySayalala(String city){
System.out.println("再见!"+city);
}
public static void main(String[] args) {
String address1="http://127.0.0.1:8888/ws/phoneService";
// String address2="http://127.0.0.1:8888/ws/phoneManager";
/**
* 发布webservice服务
* 1.address:服务的地址
* 2:implementor 服务的实现对象
*/
Endpoint.publish(address1, new PhoneService());
// Endpoint.publish(address2, new PhoneService());
System.out.println("wsdl地址 :"+address1+"?WSDL");
}
}
1.在类上添加@WebService注解,代表发布一个WebService服务
2.通过EndPoint(端点服务)发布一个webService。Endpoint也是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。
3.Endpoint.publish(String address, Object implementor) 静态方法在给定地址处针对指定的实现者对象创建并发布端点
4.给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布
5.如果希望某个方法不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
6.如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。
protected、private、final、static方法不能对外公开
package cn.dzp.webservice.dd;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService // 添加了此注解,代表是一个WebService
public class HelloWorld {
// 非 static final private 方法默认会发布
public String sayHi(String name) {
return "hello" + name;
}
@WebMethod(exclude=true)
public void exclude(){
// 被注解排除的方法
}
protected void protected1(){
//受保护的方法默认不发布
}
private void private1(){
// 私有方法默认不发布
}
public static void static1(){
// static 方法默认不发布
}
public final void final1(){
// final 方法默认不发布
}
}
运行之后就可以看到生成的webservice能够在浏览器访问
http://127.0.0.1:8888/ws/phoneService?WSDL