`
xiaomogui
  • 浏览: 239152 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

webservice之基本概念

阅读更多

 1. 基本概念    

      SOA 面向服务的体系结构(Service-Oriented Architecture,SOA)
      SOAP:(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的轻量级协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上, 以任何一种语言相互通信。
      SOAP包括四个部分:
      SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;
      SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;
      SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;
      SOAP绑定(binding),使用底层协议交换信息。

 

2. WebService体系结构

      Web Services 服务提供方通过WSDL(Web Services Description Language) 描述所提供的服务,并将这一描述告知Web Services 注册服务器。注册服务器依据WSDL 的描述,依照UDDI (Universal Description Discovery and Integration) 的协定更新服务目录并在Internet 上发布。用户在使用Web Services 前先向注册服务器发出请求,获得Web Services 提供者的地址和服务接口信息,之后使用SOAP 协议(Simple Object Access Protocol) 与Web Services 提供者建立连接,进行通信。Web Services 的技术主要建立在XML 的规范之上,这保证了这一体系结构的平台无关性、语言无关性和人机交互性能。


3. WebService原理

       客户端通过get请求可以得到wsdl文件,也就知道服务器提供的方法和参数了,然后客户端会通过webservice提供的工具类(通常为wsdl to java生成相应的类)。  接下来,客户端会向webservice发送一个soap请求,这个soap请求实际上就是一段xml代码,然后server接收到soap请求,然后进行相应的处理,并将响应结果以soap 方式发送回客户端。

 

4.Axis

      Axis本质上就是一个SOAP引擎(Apache Axis is an implementation of the SOAP),提供创建服务器端、客户端和网关SOAP操作的基本框架。
      但Axis并不完全是一个SOAP引擎,它还包括:
      是一个独立的SOAP服务器。
      是一个嵌入Servlet引擎(例如Tomcat)的服务器。
      支持WSDL。
      提供转化WSDL为Java类的工具。
      提供例子程序。
      提供TCP/IP数据包监视工具。

     WSDL(Web Service Description Language)Web服务器描述语言是用XML文档来描述Web服务的标准,是Web服务的接口定义语言
   
     WSDD就是WEB服务分布描述(Web Service Deployment Descriptor), 它定义了WEB服务的接口,如服务名、提供的方法、方法的参数等信息。

     UDDI就是统一描述、发现和集成(Universal Description, Discovery, and Integration)。
     UDDI用于集中存放和查找WSDL描述文件,起着目录服务器的作用。

     AXIS有四种service styles分别是:RPC, Document, Wrapped, Message。最常用的就是RPC和Message。
     RPC:
     在AXIS中是一个默认选项。当你部署的时候使用下列两种方式: 或则 ,它遵循SOAP RPC和编码规则。
每个RPC都包括一个表示名称的外部接点和一些表示参数的内部接点。AXIS会根据规则将一个XML(WSDL文件)
文件转化成一个JAVA对象,并对对想赋上在文件中描述的值。也可以根据规则将一个JAVA对象转化成XML文件。
     Message:
     以这种方式部署的话,会使AXIS失去意义,它使你的代码真正的用XML形式,而不需要转化成JAVA对象。

     基于RPC(远程过程调用)方式,这也是Web服务最常用的方式。面向消息/文档的的类型跟RPC不同的是它提供了一个更底层的抽象,要求更多的编程工作。客户端可以传入任何的XML文档,得到的响应不一定是SOAPEnvelope,可以返回任何它所需要的东西,甚至不返回。
     虽然这对开发者来说非常的灵活,但是这种通讯类型在实际的应用中并不常见。面向消息/文档的Web服务主要适合于下面几种情况,
     比如批量处理,基于表单的数据导入,有需要返回非XML数据时,Web服务器实现中要求直接访问传输层等等


   Webservice的工作方式一般包括:远程方法调用和消息发送
    远程方法调用:比较简单,两端可以直接使用对方返回来的对象,不用关系他们是怎么解析的。
    消息发送:    (style="message") 一般直接传送xml数据格式。适合传递的数据已经是xml类型的。


    Webservice返回对象一般要配置beanMapping , typeMapping
    beanMapping 一般指简单的javaBean,只包括Getter和Setter方法。
    typeMapping可以处理比较复杂的类型。比如附件的DataHandler ,当然也包括简单类型。所以只用TypeMapping即可。

    注:
    wsdd -Web   Service   Deployment   Descriptor,部署文件  
    wsdl -Web   Service   Deployment   Language,WebService描述
    wsdd和wsdl的区别在于前者只描述Web服务和操作方法以及传输方式,它相对于wsdl要简单的多,更易被人读懂。

 

 
    Axis支持三种web service的部署和开发,分别为:
    1、Dynamic Invocation Interface ( DII) 如.jws
    2、Stubs方式  如:.wsdd
    3、Dynamic Proxy方式

 

 axis 配置:
   1. axis所需要的包配置在环境变量path中,因为生成service-config.wsdd文件要用到。
   用Eclipse开发时,要把axis包放到项目的web-inf/lib 目录下,链接的话好像有问题,会报找不到所需要的包。
   axis 返回一个自定义对象。我自己在做的时候遇到的一些问题。


   服务器端配置:
   自定义对象 User.java
        

package com.gui.webservice;

import java.util.Date;

public class User {
	private String name = "qin";
	private int age = 25;
	private Date date;

	public String toString() {
		return "name " + name + " age " + age + " date " + date;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}
}

 

 

 

       主程序,向外提供接口
       

package com.gui.webservice;

public class ServiceServer {
	public String getName(String name) {
		if (name == null) {
			name = "";
		}
		return "你好" + name + ",欢迎来到Web服务的世界!";
	}

	public User getUser(User user) {
		System.out.println(" 传来对象的用户名====" + user.getName());
		return user;
	}

	public User[] getUserList(User[] user) {
		System.out.println("从客户端传过来对象的个数======" + user.length);
		return user;
	}

	public String getUserName(User user) {
		return user.getName();
	}

	public User getUser(String name, String password) {
		return new User();
	}
}

  

 

 

   2.  在项目的web-inf目录下建一个deploy.wsdd 文件夹,输入如下内容。

  

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
	<service name="User" provider="java:RPC">
		<parameter name="scope" value="Request" /><!-- 要发布的类-->
		<parameter name="className"
			value="com.gui.webservice.ServiceServer" /><!-- *表示所有的public方法都发布,如果不是public就不发布,或者把想发布的发放名字列出,方法名之间用空格隔开-->
		<parameter name="allowedMethods" value="*" /><!-- 和typeMapping差不多,-->
		<beanMapping languageSpecificType="java:com.gui.webservice.User"
			qname="ns1:User" xmlns:ns1="com.gui.webservice" /><!-- 返回一个自定义对象的配置-->
		<typeMapping languageSpecificType="java:com.gui.webservice.User"
			qname="ns2:User" xmlns:ns2="com.gui.webservice"
			deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
			serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" />
		<!-- 返回数组列表的配置 ,encodeStyle是固定的-->
		<typeMapping xmlns:ns="http://localhost:8888/services/User"
			qname="ns:ArrayOf_tns1_Employee"
			type="java:com.gui.webservice.User[]"
			serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
			deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
			encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
	</service>
</deployment>

 

   3. 打开 程序 --》 运行  cmd ;进入dos目录下 cd进入到项目所在的web-inf 目录下。 
       输入:
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient 

               - lhttp://localhost:8888/services/User  deploy.wsdd
    
     如果成功的话会显示  Processing file deploy.wsdd
                         <Admin>Done processing</Admin>
     同时在web-inf 目录下生成一个service-config.wsdd文件,其中的一部分代码。和在deploy.wsdd文件中配置的beanMapping,typeMapping,typeMapping(返回数组) 是对应的。
  

 

<service name="User" provider="java:RPC">
	<parameter name="allowedMethods" value="*" />
	<parameter name="className"
		value="com.gui.webservice.ServiceServer" />
	<parameter name="scope" value="Request" />
	<typeMapping
		deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
		encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
		qname="ns1:User"
		serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
		type="java:com.gui.webservice.User" xmlns:ns1="com.gui.webservice" />
	<typeMapping
		deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
		encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
		qname="ns2:ArrayOf_tns1_Employee"
		serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
		type="java:com.gui.webservice.User[]"
		xmlns:ns2="http://localhost:8888/services/User" />
	<beanMapping languageSpecificType="java:com.gui.webservice.User"
		qname="ns3:User" xmlns:ns3="com.gui.webservice" />
</service>

 


      
    注:java -Djava.ext.dirs=lib 表示 启动 Java 程序时用来修改默认查找扩展类库中类的路径
          deploy集体的配置还是看一下axis自带的例子。根据网上的例子,三种类型我一种也没有配置成功。倒是根据axis自带例子一配置就成功了。
    -lhttp://localhost:8888/services/User 

    deploy.wsdd  的格式是 -lhttp://localhost:8888/项目服务名称(如果没有就不写)/services(这个固定)/User(就是deploy.wsdd文件中serviceName的名称)  deploy.wsdd

 

 


     客户端调用:

     这个事返回一个自定义对象。
 

package com.gui.webservice;

import java.util.Date;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;

public class Client {
	public static void main(String[] args) {
		try {
			String endpoint = "http://localhost:8888/services/User?wsdl";
			Service service = new Service();
			Call call = null;
			QName qn = new QName("http://localhost:8888/services/User",
					"getUser");
			call = (Call) service.createCall();
			call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(
					User.class, qn),
					new BeanDeserializerFactory(User.class, qn));
			call.setReturnType(qn, User.class);
			call.setOperationName(qn);
			call.setTargetEndpointAddress(new java.net.URL(endpoint));
			call.addParameter("user", qn, javax.xml.rpc.ParameterMode.IN);
			User user = new User();
			user.setName("sdf");
			user.setDate(new Date());
			User ret = (User) call.invoke(new Object[] { user });
			System.out.println("return value is " + ret);
		} catch (Exception ex) {
			ex.getMessage();
			ex.printStackTrace();
		}
	}
}

 

 

 

 
   这个是返回一个数组

package com.gui.webservice;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;

public class ClientList {
	public static void main(String[] args) {
		try {
			String endpoint = "http://localhost:8888/services/User?wsdl";
			Service service = new Service();
			Call call = null;
			QName qn = new QName("http://localhost:8888/services/User",
					"getUserList");
			call = (Call) service.createCall();
			call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(
					User.class, qn),
					new BeanDeserializerFactory(User.class, qn));
			call.setReturnType(qn, User[].class);
			call.setOperationName(qn);
			call.setTargetEndpointAddress(new java.net.URL(endpoint));
			call.addParameter("user", qn, javax.xml.rpc.ParameterMode.IN);
			User[] user = new User[] { new User(), new User() };
			User[] ret = (User[]) call.invoke(new Object[] { user });
			ArrayList al = new ArrayList(Arrays.asList(ret));
			System.out.println("return value is " + al.size());
			System.out.println("return value is " + ret.length);
		} catch (Exception ex) {
			ex.getMessage();
			ex.printStackTrace();
		}
	}
}

 

    运行一般情况下没有问题。

 

 

 

 

分享到:
评论

相关推荐

    WebService的基本概念详细介绍

    WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。

    WebService从入门到上手企业开发(上)

    黑马程序员_WebService从入门到上手企业开发(上) 视频含有 webservice的基本概念,实现天气查询,通讯原理等功能 上传的代码给百度云链接,此链接永不失效

    Web Service基本概念

    Web Service 概念 WebService 基本概念 对学些 Web Service的朋友门还是有点点帮助的

    C#调用WebService实例开发

    一、基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,...

    WebService入门教程

    介绍webservice的基本概念、技术构成以及AXIS开发示例

    C#调用WebService实例与开发教程(推荐)

    1.1、Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL...

    利用WSDL和UDDI为公共WebService建立统一接口.pdf

    摘要:WebSenAce是使用Web的崭新模式,在某些公共的webService中实现统一接口,将使得客户端编程更加方便。介绍了WSDL和UDDI的基本概念,以及如何利用WSDL和UDDI来建立统一接口。

    利用WSDL和UDDI为公共WebService建立统一接口

    介绍了WSDL和UDDI的基本概念,以及如何利用WSDL和UDDI来建立统一接口。

    通过socket实现webservice的功能.rar

    1、Socket基本概念 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求, Socket本质是编程接口(API),是对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket...

    php如何调用webservice应用介绍

    1.1、Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL...

    C++课设:基于QT+webservice的天气查询系统.zip

    Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个模块通常就是一个编程主题,如数据库、图表、网络等。 一、Qt核心特点 1.1.概述 Qt本身并不是一种编程语言,它本质上是一个跨平台的C++开发...

    VB.NET2005教程(7):利用VB.NET2005创建Web应用

    本课程利用VB.NET2005工具,介绍基于.NET进行Web应用开发的基本概念和实用技术,包括WebForm,Code Behind,DataGrid等。最后会介绍在Web开发中越来越重要的Web服务(WebService)技术,并演练web服务的开发过程和...

    067_《Delphi7组件与分布式应用开发》

    贯穿实例深入浅出地介绍了Delphi 7支持的组件技术、VCL库的扩充的一般方法、可视组件的开发与发布、ActiveX控件技术、COM/DCOM/COM+的基本概念与原理、在Delphi 7中使用COM/DCOM/COM+、CORBA技术体系、应用CORBA、...

    Flex新手教程_入门级学习笔记

    1.ActionSctipt核心概念 1 1.1类和对象 Class and Object 1 1.2包与命名空间 Package and NameSpace 1 1.3构造方法Constructor 2 1.4变量和值 Variable 2 1.5赋值 2 1.6 AS数据类型 3 1.7数据类型转换 3 1.8实例方法...

    ASP.NET应用与开发案例教程

    5.1ADO.NET基本概念 5.1.1ADO.NET对象模型 5.1.2ADO.NET对比ADO 5.2ADO.NET数据库连接概述 5.3使用Connection对象 5.4使用Command和DataReader对象 5.4.1Command对象 5.4.2DataReader对象 5.4.3使用Command对象实现...

    使用KatalonStudio创建你的第一个API测试

    API测试(或WebService测试)在软件测试中变得越来越重要。根据谷歌趋势报告,过去五年来,行业内对API测试的兴趣一直在增加。这种趋势在一定程度上表明API测试的...TestCase:这是KatalonStudio项目结构中最重要的概念

    Webserver开发指南

    本文是关于webservcie开发指南,其中主要包括:基本概念、使用axis来进行开发和测试、axis和spring集成开发、aixs和web服务期集成开发、通过ObjectWeb Lomboz工具生成客户端和服务器代码方式等等。 核心内容包括: ...

    J2EE学习笔记

    第四章:面向对象基本概念 155 4.1:统一建模语言UML 155 4.2:面向对象设计原则 165 第五章:软件系统架构设计 167 第六章:J2EE专题学习 167 6.1:EJB 167 6.2:JMS 172 6.3:Socket 182 6.4:WebService 189 6.5:集群...

    Visual Basic 2008程序设计完全自学教程 2/2

    难易适中:以简单易懂和循序渐进的方式来阐述基本概念及其应用,有效降低学习难度 完整范例:书中所有范例都是完整程序,且注释丰富,能有效降低学习障碍 内容丰富:Visual Basic2008的基础语法、面向对象编程、窗体...

Global site tag (gtag.js) - Google Analytics