webservie+soap+wsdl入门

资料收集

使用天气调用的webservice进行学习
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL

1.简介

最近因为一些特殊的需求需要提供一个基于 soap 的 webservice服务,之前没有经验,也不知道该怎么做,于是从网上查了很多东西,资料很多,但是大多不够详细,后来查到天气预报的webservice服务说明,算是看懂了一些,写在这里权做给大家做一个入门引导好了。

  

2.什么是webservice,什么是soap,什么是 wsdl

  • SOAP:Simple Object Access Protocol
  • WSDL:Web Services Description Language
    一开始接触这个东西的时候完全把我搞晕了。真的是坑,各种概念。我这里根据我的采坑经验给一些自己的见解,当然也要避免误导参考的人,所以力求准确吧。

2.1 什么是webservice

  我觉得这个webservice有着狭义和广义的定义.
  广义的来说,webservice差不多就是字面意思:web + service,也就是 服务(service)网络(web)化的意思。他力求的是跨语言,跨平台的,基于web传输的远程调用能力。他没有强调远程调用使用什么协议,所以你可以自由选择,比如soap 协议(可与基于http,smtp,等各种传输协议),或者常见的基于http的json化的数据传输协议,基于dubbo协议的dubbo服务调用都属于web service的一种实现。
  狭义的来说,这个首先声明,是我参考网上的资料已经自身的一些经历的解读哈。我认为大家经常谈的webservice是指基于soap协议实现的远程服务调用模型。

2.2 什么是soap

  saop定义了数据交互中如何传递消息的规则。比如在http中规定了post请求的传参方式,在数据类型不同的情况下可以使用不同的参数方式。在form格式下是 key=v&key1=v1 ,同样soap也是定义这些东西的。

2.3 什么是wsdl

  同样的,当我们用http方式去调用一个服务的时候我们只是知道通用的http协议的传参方式还是不够的,我们仍然需要知道目标服务的接口文档,对了,这就是wsdl,每个服务都有的接口文档,在http上可能就是我们手写的一个wiki文档,在soap中就是一个用wsdl规范编写的wsdl文档,每个服务是有能力自动生成这个文档的。wsdl规范了这个文档应该怎么写。

综上所述:soap可以类比http协议,wsdl可以类比一个http服务的接口文档。

3.结合比较常用的soap服务的wsdl文档来了解一下wsdl

这次用的一个比较常用的文档就是天气预报的webservice服务来进行学习
链接:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
对应的是这个文档的可读性更强的介绍,他的实际接口文档是
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL
这篇接口文档实际上是有多个接口的描述,当然,我们这里只取一个来进行描述,取的接口是
getWeatherbyCityName
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName
这个页面有详细的请求体和返回结果,很具体。下面我们就从他的实际接口文档wsdl中来分析一下都有什么东西。
我们知道wsdl文档包含了这么几个部分





   definition of types........
数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)



   definition of a message....
通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。



   definition of a port.......
对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。



   definition of a binding....
特定端口类型的具体协议和数据格式规范的绑定。



相关服务访问点的集合。


下面我们使用getWeatherbyCityName这个接口在总的xml对应的部分做说明,将xml提取出来如下
还请学习下面的文档的时候参考 对应的可视化文档
进行对比



    
    
        
        
            
                
                    
                
            

            
                
                    
                        
                    
                
            

            
                
                    
                        
                    
                
            
            
            
                
                    
                        
                        
                    
                
            
        
    

    
    message 用来定义每个soap服务的入参和出参,包括参数名,参数类型信息。当引用了types  当中定义的element元素的时候,name只是有占位意义,并不具备实际的意义
当引用了types中定义的 type型元素的时候,name 是有意义的,这里的每个message定义并不是针对某个接口的,而是作为基础元素,在portType中描述接口的时候使用。
    
        name只是有占位意义,并不具备实际的意义
        
    
    
        
    
    
        name 是有意义的
        
    
    
        
    

    
        name 是有意义的
        
    
    
        
    

    
    定义了一个接口的入参和出参,每个portType元素实际上对应了一个接口,就像springMVC当中controller当中定义的一个有@RequestMapping注解的方法一样,他描述了这个方法的入参和出参。
    
        
            
            
        
    
    
        
            
            
        
    
    
        
            ...
            
            
        
    

   
    仔细观察下面的配置的话可以发现,这几个bingding元素的差异是很大的。
   在bingding的第二行说明的是 该bingding使用的协议,是 soap或者soap12 或者是 http-get 或者是 http-post 
   这里的 bingding 元素对应的type属性标识了对应的portType元素
   这里的operation对应了上面对应bingding元素中的operation,同时,这里可以岁输入输出做一些处理,比如urlEncoded。use="literal"表示不做特殊处理。
    
        
        
            
            
                
            
            
                
            
        
    
    
        
        
            
            
                
            
            
                
            
        
    
    
        
        
          在http类型中还会增加具体的location信息,这个在对应的http请求里面是可以区分出来的,比如,
          soap对应的请求是 POST /WebServices/WeatherWebService.asmx HTTP/1.1 
          http-get对应的请求是  GET /WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=string HTTP/1.1

            
            
                
            
            
                
            
        
    
    
        
        
            
            
                
            
            
                
            
        
    


   
    这里定义的是每个方法具体的访问地址,指向了每个bingding具体绑定的服务地址。
    
        
            
        
        
            
        
        
            
        
        
            
        
    


4. 干脆把对应的请求信息也摘录下来好了

截取自 这里

getWeatherbyCityName

4.1 SOAP 1.1

以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。

POST /WebServices/WeatherWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/getWeatherbyCityName"



  
    
      string
    
  



HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length



  
    
      
        string
        string
      
    
  

4.2 SOAP 1.2

以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。

POST /WebServices/WeatherWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length



  
    
      string
    
  


HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length



  
    
      
        string
        string
      
    
  


4.3 HTTP GET

以下是 HTTP GET 请求和响应示例。所显示的占位符需替换为实际值。

GET /WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=string HTTP/1.1
Host: www.webxml.com.cn

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length



  string
  string

4.4 HTTP POST

以下是 HTTP POST 请求和响应示例。所显示的占位符需替换为实际值。

POST /WebServices/WeatherWebService.asmx/getWeatherbyCityName HTTP/1.1
Host: www.webxml.com.cn
Content-Type: application/x-www-form-urlencoded
Content-Length: length

theCityName=string


HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length



  string
  string


你可能感兴趣的:(webservie+soap+wsdl入门)