WebService 笔记

webservice笔记详解

1.首先需要提出一个问题:什么是webservice,它具体是做什么的
    
    回答:webservice就是一套服务,主要作用是用来协助不同平台之间的web通信的(跨平台,跨语言)
    
    手写Socket通信,验证http协议的底层为socket
    socket的特点:
       1.开启端口,该通信为长连接通信,很容易被防火墙回收,可以通过心跳机制来实现,但是开发难度会比较大。
       2.传输的数据是字符串,可读性不强
       3.socket端口不便于推广
         http://45.113.192.102:2345    www.baidu.com
       4.性能相较于其他通信协议是最优秀的
    http协议访问:属于应用层的协议,对socket进行了封装
       1.跨平台
       2.传输数据不够友好,例如get请求直接将参数暴露在外 
         http://localhost:8080?username=jack&age=18       
       3.对第三方应用提供服务,希望对外暴露服务接口
      
    问题:
       1.数据封装不够友好   (现在使用xml或者json传送数据)
        2.希望给第三方应用提供web形式的服务     http + xml = web service
       
2.WebService专业名词详解       
     XML: Extensible Markup Language  ——扩展性标记语言
       1.用于传输格式化的数据,是web服务的基础
         namespace:-命名空间
             1.xmlns="http://www.springframework.org/schema/beans" 使用默认命名空间
             2.xmlns:jaxws="http://cxf.apache.org/jaxws"  使用指定名词(jaxws)的命名空间
             
     WSDL: WebService Description Language ——web服务描述语言(调用该web服务的api描述)    
        1.通过XML形式说明服务在什么地方,——地址
        2.通过XML形式说明服务提供什么样的方法,——如何调用    
        
     Soap: Simple Object Access Protocol ——简单对象访问协议
        1.soap作为一个基于xml语言的协议用于网上传输数据
        2.SOAP = HTTP + XML
        3.SOAP是基于HTTP的 (这里顺便补充一下,Http是基于Socket的)
        4.SOAP的组成如下
               1.Envelope: 必须的,以XML根元素出现
               2.Header:可选的
               3.Body:必须的,在body部分包含一些,执行服务器的方法,和发送到服务器的数据        
                 例如下面这个soap1.1请求: 服务器方法是:GetStockPrice  传递的数据是:StockName:IBM               
        POST /InStock HTTP/1.1
        Host: www.example.org
        Content-Type: application/soap+xml; charset=utf-8
        Content-Length: nnn
        <?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:Body xmlns:m="http://www.example.org/stock">
          <m:GetStockPrice>
            <m:StockName>IBM</m:StockName>
          </m:GetStockPrice>
        </soap:Body>
        </soap:Envelope>    

3.WebService实践(调用第三方WebService服务)
      通过客户端访问webService,让应用拥有手机归属地查询功能。
        1.一般访问方式  HttpClient
            1.http-get
            2.http-post
            3.soap(http+xml)    是Http-Post的一个专用版本,而WebService使用Soap请求,因此WebService也使用Http-Post           
          存在两个问题
            1.如何解析结果
            2.如何传递参数
        2.在jdk1.6版本以前,java通过jax-ws包实现WebService功能的支持,早起通过注解的方式进行使用
            1.早期版本 jax-rpc (remote produce call)    

        3.在jdk1.6之后,java引入了wsimport实现对于WebService功能的支持,通过wsimport生成本地代理,我们在通过此代理来调用第三方服务    
            1.wsimport命令的位置: C:\Program Files\Java\jdk1.8.0_171\bin
            2.wsimport的使用
                 1.必须配置好java环境变量  
                   wsimport -help
                 2.语法: wsimport [options] <wsdl_uri>
                      选项:  
                         -s: 指定源码输出的位置 (生成编译后的.class源码)
                         -p: 指定目标包的位置 (生成的源码的位置java代码)
                      wsdl_uri:
                         wsdl的统一资源标识符  例子: http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL    或者是保存在本地的wsdl文件:  ./WeatherWebService.wsdl    

        调用第三方服务三连:
            1.创建服务对象
            2.获取连接方式 soap1.1 、 soap1.2 、 http-get 、 http-post
            3.调用服务
4.WebService实践(自己开发服务,并且发布服务供他人调用)        (注意:默认情况下,@WebService将 public关键字修饰的方法进行发布,而private修饰的方法不会发布)
      1.自己开发一个WebService服务,声明服务的方式是使用@WebService注解
        @WebServices
      2.发布自己开发的服务以供他人调用
        EndPoint.publish(address,implementer)  //参数一表示:服务发布的地址,参数二表示:服务实现者
      3.测试,自己通过wsimport生成本地代理,来调用自己发布的服务
            1.创建服务对象
            2.获取连接方式 soap1.1 、 soap1.2 、 http-get 、 http-post
            3.调用服务      
            
            
5.WebService文档解读

 


    
6.通过注解配置修改WSDL文件的可读性
      1.修改服务方法的输入参数名称,返回参数名称
        1.@WebResult(name="phone") 修改返回参数的名称
        2.@WebParam(name="osName") 修改输入参数的名称
      2.修改服务名称和服务所对应的方法的名称
        1.@WebService(serviceName="MobileService") 修改服务的名称
        2.@WebMethod(operationName="getMobileInfo") 修改服务的方法名称
      3.对于某些public方法也并不想发布出去  
        1.使用 @WebMethod(exclude=true)注解声明的public方法就不会被发布出去
        默认情况下,如果没有添加特殊的注解修饰,public关键字修饰的方法会被服务发布

                          
               
7.名词解释
      1.soap:
        Simple object access protocol 简单对象访问协议  http + xmlns
      2.SOA:
        Service oriented architecture 面向服务的架构 是一种开发思想(即插即用)    
      3.wsdl
        WebService Description Language WebService描述语言
      4.uddi    
        Universal Description Discover Integration 统一描述发现集成
        我们可以将我们发布的WebService通过uddi注册,发布,集成到一起,用户可以通过uddi查找到对应集成处的服务    
      5.WebService属于Web应用三层架构的哪一个层次    (三层架构:界面层,业务逻辑层,数据访问层)    
        当然属于Service层(业务逻辑层)
      6.WebService到底属于客户端还是服务端?
        这是一个相对的概念,由于服务可以存在相互调用,所以WebService既可以充当服务端,又可以充当客户端,需要根据实际情况做判断。    


8.面向接口编程实现WebService服务
      1.面向接口实现WebService注意事项
        1.在接口类上声明@WebServices
        2.在接口类的实现类上声明@WebService(endpointInterface="com.ncs.xxx")
        
      2.打jar包
        jar [选项] 归档文件名 原始资源位置
        选项:  
            -c 创建一个归档文件(即压缩文件)
            -v 显示到底压缩了哪些文件,显示压缩过程
            -f 后面跟文件名,即自己创建的归档文件名
          
       例子: jar -cvf JavaService.jar ./com           

 

9.CXF框架实现WebService服务   
      1.比较Endpoint发布服务和CXF框架发布服务的优缺点
          EndPoint: 
              缺点:   1.没有与系统集成在一起,需要开启一个Main线程。而实际中我们希望tomcat启动时,WebService服务能够开启
                            2.希望拥有一个WebService服务列表
        
          CXF:
              特点:   1.与Spring,Servlet实现了无缝对接,同时内置了Jetty容器用于发布服务         
                            2.支持注解声明@WebService服务
                            3.能够生成一个WebService服务列表
                            4.能够添加拦截器  例如:输入日志拦截器,输出日志拦截器,用户权限拦截器(有些服务并不想暴露给所有用户)                     
    
      2.协议 Soap ,Restful ,Http-get Http-post
            Soap = http + xml
            Restful = http + json
            xml: 具有较强的可读性,解析不如json方便简洁,但是xml描述丰富,可以拥有丰富的定义生成接口或者相关的类
            json:具有较强的可读性,解析方便简洁,但是描述简单,不便于生成接口或者相关的类

       3.CXF ----- ServerFactoryBean 实现WebService服务
             1.可以发布WebService服务,但是不支持注解,但是不加注解也会对外暴露服务
             2.不支持拦截器
             
       4.CXF ----- JaxWsServerFactoryBean 实现WebService服务    
             1.支持注解,但是不加注解的话,虽然不会报错,但是也不会对外暴露服务
             2.可以添加拦截器             

 

             
10.    Spring和CXF框架的整合
        1.CXF的Maven依赖:
        <properties>
        <cxf.version>2.2.3</cxf.version>
        </properties>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <!-- Jetty is needed if you're are not using the CXFServlet -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        
         2.这个CXF源码jar包已经集成了Spring框架源码jar包 
         
         3.Spring和CXF框架的整合来发布WebService
            实现步骤:
               1.添加源码jar包依赖
               2.编写业务类,通过cxf来发布WebService
               3.添加一个CXF请求的Servlet,用来处理Webservice的请求,过滤的地址/ws/*
               4.配置Spring配置文件,applicationContext.xml,将cxf的bean交由spring管理
               5.在项目文件Web.xml中配置cxf的Servelet,添加Spring的监听
               
               
               
11.WebService测试工具
       使用Eclipse内置的Web Service Explorer 在WSIL页面输入服务说明url,即可快速实现Web Service测试


12.Soap1.1 和Soap1.2各自特点和区别    

      SOAP 1.1 request: 
            POST /WSShakespeare.asmx HTTP/1.1 
            Host: www.xmlme.com 
            Content-Type: text/xml; charset=utf-8 
            Content-Length: length 
            SOAPAction: "http://xmlme.com/WebServices/GetSpeech" 
            
            <?xml version="1.0" encoding="utf-8"?> 
            <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
              xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
              <soap:Body> 
                <GetSpeech xmlns="http://xmlme.com/WebServices"> 
                  <Request>string</Request> 
                </GetSpeech> 
              </soap:Body> 
            </soap:Envelope> 

     SOAP 1.2 request: 
            POST /WSShakespeare.asmx HTTP/1.1 
            Host: www.xmlme.com 
            Content-Type: application/soap+xml; charset=utf-8 
            Content-Length: length 
            
            <?xml version="1.0" encoding="utf-8"?> 
            <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
              xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
              <soap12:Body> 
                <GetSpeech xmlns="http://xmlme.com/WebServices"> 
                  <Request>string</Request> 
                </GetSpeech> 
              </soap12:Body> 
            </soap12:Envelope> 
      主要区别: 
             1. 普通http post的contentType为application/x-www-form-urlencoded
             2. SOAP 1.2 使用 "application/soap+xml" 作为 Content-Type 而 SOAP 1.1 使用 "text/xml". 
             3. SOAP 1.2 不使用 SOAPAction 请求头,而SOAP1.1使用SOAPAction请求头. 
             4. 在CXF中两种协议请求的方式也不一样,SOAP1.1使用content-Type:text/xm;charset=UTF-8 而SOAP1.2使用 content-Type:application/soap+xml;charset=UTF-8
             5. 在定义Service部分差别如下: Soap1.1是以:soap:address定义 而 Soap1.2是以:  soap12:address定义,且-jdk1.6不支持SOAP1.2形式的访问
             6. SOAP 1.2 使用 "http://www.w3.org/2003/05/soap-envelope" 作为 the envolope 命名空间 而 SOAP 1.1 使用 "http://schemas.xmlsoap.org/soap/envelope/" 
             7. WSIL文件也存在不同         

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值