`

WebService原理简述

阅读更多
Web Service 是一种可以接收从internet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在WEB上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

Web Service四大组成部分:
1、XML 扩展型可标记语言,其是WebService表示数据的基本格式,是Web Service标准的基础及核心。

2、SOAP 简单对象访问协议,是一种基于XML的轻量级消息交换协议。利用SOAP可以在两个或多个对等实体之间进行信息交换,并可以使这些实体在分散的分布式应用程序中相互通信。

3、WSDL Web Service描述语言,其是一种XML格式,用于描述网络服务及其访问信息。WSDL用于定义Web服务的元数据语言,描述服务提供方和请求方之间如何进行通信。大多数情况下由软件自动生成和使用。

4、UDDI 通用描述、发现与集成服务,UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。

1.WSDL: Web服务定义语言(Web Service Definition Language),用来定义服务接口。实际上,它能描述服务的两个不同方面:服务的签名(名字和参数),以及服务的绑定和部署细节(协议和位置)。
2.SOAP:简单对象访问协议(Simple Object Access Protocol),是定义Webservice的协议。HTTP是一个网络数据交互的底层协议,而SOAP是Web Service数据交换的专用协议。
3.UDDI:通用描述、发现与集成服务(Universal Description, Discovery and Integration),UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
SOAP是协议,就像HTTP协议一样,一般框架都已经集成;
UDDI扮演者补充的角色,非必须,而且通常在实践中也不用。
WSDL是开发人员打交道最多的东西,也算是Webservice的核心了。


Web Service原理模型




Web Service服务:简单的说,Web服务是一个URL资源,客户端可以通过编程方式请求得到它的服务,而不需要知道所请求的服务是怎样实现的。


Web Service的体系结构是基于:Web服务提供者、Web服务请求者、Web服务中介者三个角色和发布、发现、绑定三个动作构建的。

Web服务提供者:是Web服务的拥有者,它耐心等待为其他服务和用户提供自己已有的功能;

Web服务请求者:是Web服务的使用者,它利用SOAP消息向Web服务提供者发送请求以获得服务;

Web服务中介者:是把一个Web服务请求者与合适的Web服务提供者联系在一起,它充当管理者的角色,一般是UDDI。

发布 : 是为了让用户或其他服务知道某个Web服务的存在和相关信息;

查找 : 是为了找到合适的Web服务服务;

绑定 : 是在提供者与请求者之间建立某种联系。


实现一个完整的Web服务包括以下步骤:

◆ Web服务提供者设计实现Web服务,并将调试正确后的Web服务通过Web服务中介者发布,并在UDDI注册中心注册; (发布)

◆ Web服务请求者向Web服务中介者请求特定的服务,中介者根据请求查询UDDI注册中心,为请求者寻找满足请求的服务; (发现)

◆ Web服务中介者向Web服务请求者返回满足条件的Web服务描述信息,该描述信息用WSDL写成,各种支持Web服务的机器都能阅读;(发现)

◆ 利用从Web服务中介者返回的描述信息生成相应的SOAP消息,发送给Web服务提供者,以实现Web服务的调用;(绑定)

◆ Web服务提供者按SOAP消息执行相应的Web服务,并将服务结果返回给Web服务请求者。(绑定)

webservice 的调用有3种方式

1). httpget
2). httppost
3). httpsoap

soap 的优点是 可以传递结构化的 数据,而前两种不行。
soap 最终也是使用 HTTP 传送 XML。


在Webservice中的安全主要分为以下三个方面。

传输      SSL/HTTPS 对连接加密,而不是传输数据

消息      数据加密(XML Encryption)   数字签名(XML-DSIG)

底层架构  利用应用服务安全机制

传输时的安全是最容易被加入到你的Webservice应用中的,利用现有的SSL 和HTTPS协议,就可以很容易的获得连接过程中的安全。

然而这种安全实现方法有两个弱点。一是它只能保证数据传输的安全,而不是数据本身的安全,数据一旦到达某地,那么就可以被任何人所查看。而在Webservice中,一份数据可能到达多个地方,而这份数据却不该被所有的接受者所查看。二是它提供的是要么全有要么全无的保护,你不能选择哪部分数据要被保护,而这种可选择性也是在Webservice中所常要用到的。

第二层的保护是对于消息本身的保护。你可以使用已有的XML安全扩展标准,实现数字签名的功能,从而保证你的消息是来自特定方并没有被修改过。XML文件的加密技术从更大程度上加强了Webservice的安全,它能够定制数据传输到后,能否被接受者所查看,进一步完善了传输后的安全,业界也在不断的制定Webservice的安全标准,比如SAML 和 WS-Security。

最后一层保护就是依靠底层架构的安全,这更多的来自于操作系统和某些中间件的保护。比如在J2EE中,主持Webservice的应用服务器。目前很多的J2EE应用服务器都支持Java Authentication and Authorization Service (JAAS),这是最近被加入到J2SE 1.4当中的。利用主持Webservice的服务器,实现一些安全机制这是很自然的做法。另一种利用底层架构的安全方法就是,做一个独立的负责安全的服务器,Webservice的使用者和创建者都需要与之取得安全信任。


Soap消息格式
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
 
<soap:Header>
  <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
  soap:mustUnderstand="1">234
  </m:Trans>
</soap:Header>
 
 
<soap:Body>
  <m:GetPrice xmlns:m="http://www.w3schools.com/prices">
    <m:Item>Apples</m:Item>
  </m:GetPrice>
</soap:Body>
</soap:Envelope>


cxf简单案例:
package com.hsy.server;  
  
import java.util.List;  
  
import javax.jws.WebParam;  
import javax.jws.WebService;  
  
import com.hsy.pojo.User;  
  
@WebService  
public interface HelloWorld {  
    String sayHi(@WebParam(name="text")String text);  
    String sayHiToUser(User user);  
    String[] SayHiToUserList(List<User> userList);  
}  



package com.hsy.server;  
  
import java.util.LinkedHashMap;  
import java.util.List;  
import java.util.Map;  
  
import javax.jws.WebParam;  
import javax.jws.WebService;  
  
import com.hsy.pojo.User;  
  
@WebService(endpointInterface="com.hsy.server.HelloWorld",serviceName="HelloWorld")  
public class HelloWorldImpl implements HelloWorld {  
    Map<Integer, User> users = new LinkedHashMap<Integer, User>();  
  
    public String sayHi(@WebParam(name = "text") String text) {  
        return "Hello,"+text;  
    }  
  
    public String sayHiToUser(User user) {  
        users.put(users.size()+1, user);  
        return "Hello,"+user.getName();  
    }  
  
    public String[] SayHiToUserList(List<User> userList) {  
        String[] result = new String[userList.size()];  
        int i = 0;  
        for(User u:userList){  
            result[i] = "Hello " + u.getName();  
            i++;  
        }  
        return result;  
    }  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
  
    }  
  
}  



package com.hsy.server;  
  
import javax.xml.ws.Endpoint;  
  
public class webServiceApp {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
         System.out.println("web service start");  
         HelloWorldImpl implementor = new HelloWorldImpl();  
         String address = "http://localhost:8080/helloWorld";  
         Endpoint.publish(address, implementor);  
         System.out.println("web service started");  
    }  
  
}  



package com.hsy.client;  
  
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
  
import com.hsy.pojo.User;  
import com.hsy.server.HelloWorld;  
  
public class HelloWorldClient {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
          
        //首先右键run as 运行com.hsy.server.webServiceApp类,然后再运行这段客户端代码  
        JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();  
        jwpfb.setServiceClass(HelloWorld.class);  
        jwpfb.setAddress("http://localhost:8080/helloWorld");  
        HelloWorld hw = (HelloWorld) jwpfb.create();  
        User user = new User();  
        user.setName("name");  
        user.setDescription("toName");  
        System.out.println(hw.sayHiToUser(user));  
          
    }  
  
}  




  • 大小: 14.6 KB
分享到:
评论

相关推荐

    嵌入式Linux程序设计案例与实验教程-实例代码

    2.3.3 生产者-消费者模型简述22 2.3.4 缓冲区操作概述22 2.3.5 几个线程API23 实验2.3 Linux多线程使用实例——生产者-消费者协议24 2.4 进程创建以及进程间通信25 2.4.1 进程概述25 2.4.2 进程的相关...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第三部分

    2.3.3 生产者-消费者模型简述22 2.3.4 缓冲区操作概述22 2.3.5 几个线程API23 实验2.3 Linux多线程使用实例——生产者-消费者协议24 2.4 进程创建以及进程间通信25 2.4.1 进程概述25 2.4.2 进程的相关函数25 ...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第二部分

    2.3.3 生产者-消费者模型简述22 2.3.4 缓冲区操作概述22 2.3.5 几个线程API23 实验2.3 Linux多线程使用实例——生产者-消费者协议24 2.4 进程创建以及进程间通信25 2.4.1 进程概述25 2.4.2 进程的相关函数25 ...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第一部分

    2.3.3 生产者-消费者模型简述22 2.3.4 缓冲区操作概述22 2.3.5 几个线程API23 实验2.3 Linux多线程使用实例——生产者-消费者协议24 2.4 进程创建以及进程间通信25 2.4.1 进程概述25 2.4.2 进程的相关函数25 ...

    asp.net知识库

    体验.net 2.0 的优雅(1) -- 异步WebService调用 ASP.NET 2.0页面框架的几点新功能 ASP.NET 2.0 中收集的小功能点 asp.net2.0中的webpart使用小记 2.0问题、错误解决办法 ASP.NET 2.0使用Web Part创建应用程序之二...

    最新Java面试宝典pdf版

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    Java面试宝典2010版

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 56、子线程循环10次,接着主线程循环100,接着又回到子线程...

    Java面试笔试资料大全

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    JAVA面试宝典2010

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    Java面试宝典-经典

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    java面试题大全(2012版)

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    Java面试宝典2012版

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    java面试宝典2012

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 38 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 40 56、子线程循环10次,接着主线程循环100,接着又回到...

    Java面试宝典2012新版

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    net学习笔记及其他代码应用

    1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,...

    Java 面试宝典

    一. Java 基础部分............................................................................................................43、Java 中的异常处理机制的简单原理和应用。 .....................................

Global site tag (gtag.js) - Google Analytics