WebService

来源:互联网 发布:文案写得很好的淘宝店 编辑:程序博客网 时间:2024/06/03 20:50

WebService小结

前言

之前对于WebService都是简单的知道,但是没有一个比较系统的了解。最近将其进行了下整理,对每种框架都做了些实例。

 

正题

一、概念

先来看张WebService的总图,我会根据图进行讲解:


WebService不是框架,更不是一种技术,而是一种跨平台,跨语言的规范。

 

它是为了解决这一的需求场景:不同平台、不同语言所编写的应用之间如何相互调用。

 

WebService集中解决:远程调用,跨平台调用,跨语言调用。

 

实际用途

1.同一个公司的新旧系统整合

Linux上的java应用,去调用widows平台的Delphi应用

2.不同公司的业务整合

业务的整合就要带来不同公司的系统整合。

不同公司的系统可能存在平台不同,语言不同的问题

3.内容聚合

一个应用需要提高天气预报、股票行情、黄金行情、编程语言行情……

这个内容聚合的应用,需要调用大量不同平台、不同语言编写的应用方法

 

二、技术基础

1.XMLXSD

XML(Extensible Markup Language,可扩展标记语言),是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关。

 

XSD(XML Schemas Definition,XML结构定义),Web Service平台是用XSD来作为数据类型系统的。当你用某种语言如VB. NETC# 来构造一个WebService时,为了符合Web Service标准,所有你使用的数据类型都必须被转换为XSD类型。

 

2.WSDL(Web Service Definition Language,WebService定义语言)

WebService接口:

1.types(标准的Schema

2.2nmessage

3.portType-noperation


WebService实现:

1.binding元素——N个更详细的operation

2.service——指定WebService的服务器地址


实例:

 


通俗地说,WSDL文档描述了WebService如下3个方面:

WHAT:该WebService包含“什么”操作。

HOW:该WebService的操作应该“怎样”调用?

WHERE:该WebService的服务地址。

 

3.SOAP(Simple Object Access Protocol,简单对象访问协议)

SOAP依赖于XML文档来构建,一条SOAP消息其实就是一份特定的XML文档.


Envelop

根元素


Header

Header是可选的,由程序员控制添加。


Body

Body元素总是默认的。Body元素里可有两种情况:

——当WebService交互正确时,Body元素里的内容由WSDL控制。

——当WebService交互出错时,Body元素内容将是Fault子元素。

 

4.UDDI(Universal Description, Discoveryand Integration,通用描述、发现与集成服务)

    UDDI不像WSDLSOAP一样被我们所熟知,但是它也是不可缺少的。

    

    UDDI是定义如何查找Web服务(及其WSDL文件),程序开发人员通过UDDI机制查找分布在互联网上的WebService,但是由于一般情况下,wsdl都位于公司的企业内部网中,所以使用者都知道WebService的位置,所以相对起来我们对于其稍显陌生。

 

三、发展历史

WebService框架主要是经历了Axis1Axis2然后转向了XFireCXF,用的比较多的还是AxisCXF,由于在网上很容易就会搜索到相关的实例讲解,所以我会在下篇对他们做一个对比,从客户端和服务端两方面来对AxisCXF进行比较。

 

小结:

其实WebService很简单,就是在服务端将接口发布成wsdl文件,然后客户端根据相应的url调用该wsdl文件即可。传输的介质是我们的XML,使用的语言是WSDL,遵循的协议是SOAP,并且需要通过UDDI进行注册和搜索。



webservice

一、什么是webservice

1、什么是远程调用技术

远程调用技术定义:是系统和系统之间的调用


2、webservice的原理

l  Webservice是使用Http发送SOAP协议的数据的一种远程调用技术

l  Webservice要开发服务端

l  Webservice要开发客户端

l  Webservice客户端开发需要阅读服务端的使用说明书(WSDL


二、webservice入门程序

1、需求

l  服务端:发布一个天气查询服务,接收客户端城市名,返回天气数据给客户端

l  客户端:发送城市名称给服务端,接收服务端的返回天气数据,打印


2、环境

l  JDK:1.7

l  Eclipse:mars


3、实现

1、服务端

开发步骤:

l  第一步:创建SEI(ServiceEndpoint Interface)接口,本质上就是Java接口

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package cn.itcast.ws.jaxws.ws;  
  2.   
  3. /** 
  4.  * <p>Description:SEI接口</p> 
  5.  * 
  6.  */  
  7. public interface WeatherInterface {  
  8.   
  9.     public String queryWeather(String cityName);  
  10.       
  11. }  

l  第二步:创建SEI实现类,在实现类上加入@WebService

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package cn.itcast.ws.jaxws.ws;  
  2.   
  3. import javax.jws.WebService;  
  4.   
  5. /** 
  6.  * <p>Description:SEI实现类</p> 
  7.  *  
  8.  */  
  9. @WebService//@WebService表示该类是一个服务类,需要发布其中的public的方法  
  10. public class WeatherInterfaceImpl implements WeatherInterface {  
  11.   
  12.     @Override  
  13.     public String queryWeather(String cityName) {  
  14.         System.out.println("from client..."+cityName);  
  15.         String weather = "晴";  
  16.         return weather;  
  17.     }  
  18.   
  19. }<span style="color:#ff0000;">  
  20. </span>  

l  第三步:发布服务,Endpoint发布服务,publish方法,两个参数:1.服务地址;2.服务实现类

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package cn.itcast.ws.jaxws.ws;  
  2.   
  3. import javax.xml.ws.Endpoint;  
  4.   
  5. /** 
  6.  * <p>Title: WeatherServer.java</p> 
  7.  * <p>Description:天气服务端</p> 
  8. */  
  9. public class WeatherServer {  
  10.   
  11.     public static void main(String[] args) {  
  12.         //Endpoint发布服务  
  13.         //参数解释  
  14.         //1.address - 服务地址  
  15.         //2.implementor - 实现类  
  16.         Endpoint.publish("http://127.0.0.1:12345/weather"new WeatherInterfaceImpl());  
  17.     }  
  18. }  

l  第四步:测试服务是否发布成功,通过阅读使用说明书,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功。



Ø  WSDL地址:服务地址+”?wsdl”

Ø  WSDL阅读方式:从下往上





2、客户端

开发步骤

l  第一步:wsimport命令生成客户端代码

wsimport -s . http://127.0.0.1:12345/weather?wsdl


l  第二步:根据使用说明书,使用客户端代码调用服务端

Ø  第一步:创建服务视图,视图是从service标签的name属性获取

Ø  第二步:获取服务实现类,实现类从portTypename属性获取

Ø  第三步:获取查询方法,从portTypeoperation标签获取

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package cn.itcast.ws.jaxws.ws.client;  
  2.   
  3. import cn.itcast.ws.jaxws.ws.WeatherInterfaceImpl;  
  4. import cn.itcast.ws.jaxws.ws.WeatherInterfaceImplService;  
  5.   
  6. /** 
  7.  *  
  8.  * <p>Title: WeatherClient.java</p> 
  9.  * <p>Description:天气查询客户端</p> 
  10.  * 
  11.  */  
  12. public class WeatherClient {  
  13.   
  14.     public static void main(String[] args) {  
  15.         //创建服务视图  
  16.         WeatherInterfaceImplService weatherInterfaceImplService = new WeatherInterfaceImplService();  
  17.         //获取服务实现类  
  18.         WeatherInterfaceImpl weatherInterfaceImpl = weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class);  
  19.         //调用查询方法,打印  
  20.         String weather = weatherInterfaceImpl.queryWeather("北京");  
  21.           
  22.         System.out.println(weather);  
  23.     }  
  24. }  


三、webservice的优缺点

优点:

l  发送方式采用http的post发送,http的默认端口是80,防火墙默认不拦截80,所以跨防火墙

l  采用XML格式封装数据,XML是跨平台的,所以webservice也可以跨平台。

l  Webservice支持面向对象

缺点:

l  采用XML格式封装数据,所以在传输过程中,要传输额外的标签,随着SOAP协议的不断完善,标签越来越大,导致webservice性能下降


四、webservice应用场景

1、软件集成和复用


2、适用场景

l  发布一个服务(对内/对外),不考虑客户端类型,不考虑性能,建议使用webservice

l  服务端已经确定使用webservice,客户端不能选择,必须使用webservice


3、不适用场景

l  考虑性能时不建议使用webservice

l  同构程序下不建议使用webservice,比如java 用RMI,不需要翻译成XML的数据



0 0
原创粉丝点击