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文档包含了这么几个部分


<definitions>

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

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

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

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

<service>
相关服务访问点的集合。
</servie>
</definitions>

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

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://WebXml.com.cn/"
                  xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  targetNamespace="http://WebXml.com.cn/">

    <!-- types元素-->
    <wsdl:types>
        <s:schema elementFormDefault="qualified" targetNamespace="http://WebXml.com.cn/">
        <!--  可以看到,types 定义的是数据类型,可以在message元素中进行引用,他的存在形式可能是type也可能是element-->
            <s:complexType name="ArrayOfString">
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string"/>
                </s:sequence>
            </s:complexType>

            <s:element name="getWeatherbyCityName">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1" name="theCityName" type="s:string"/>
                    </s:sequence>
                </s:complexType>
            </s:element>

            <s:element name="getWeatherbyCityNameResponse">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1" name="getWeatherbyCityNameResult"
                                   type="tns:ArrayOfString"/>
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:element name="ArrayOfString" nillable="true" type="tns:ArrayOfString"/>
            <s:element name="DataSet" nillable="true">
                <s:complexType>
                    <s:sequence>
                        <s:element ref="s:schema"/>
                        <s:any/>
                    </s:sequence>
                </s:complexType>
            </s:element>
        </s:schema>
    </wsdl:types>

    <!--  message元素-->
    message 用来定义每个soap服务的入参和出参,包括参数名,参数类型信息。当引用了types  当中定义的element元素的时候,name只是有占位意义,并不具备实际的意义
当引用了types中定义的 type型元素的时候,name 是有意义的,这里的每个message定义并不是针对某个接口的,而是作为基础元素,在portType中描述接口的时候使用。
    <wsdl:message name="getWeatherbyCityNameSoapIn">
        name只是有占位意义,并不具备实际的意义
        <wsdl:part name="parameters" element="tns:getWeatherbyCityName"/>
    </wsdl:message>
    <wsdl:message name="getWeatherbyCityNameSoapOut">
        <wsdl:part name="parameters" element="tns:getWeatherbyCityNameResponse"/>
    </wsdl:message>
    <wsdl:message name="getWeatherbyCityNameHttpGetIn">
        name 是有意义的
        <wsdl:part name="theCityName" type="s:string"/>
    </wsdl:message>
    <wsdl:message name="getWeatherbyCityNameHttpGetOut">
        <wsdl:part name="Body" element="tns:ArrayOfString"/>
    </wsdl:message>

    <wsdl:message name="getWeatherbyCityNameHttpPostIn">
        name 是有意义的
        <wsdl:part name="theCityName" type="s:string"/>
    </wsdl:message>
    <wsdl:message name="getWeatherbyCityNameHttpPostOut">
        <wsdl:part name="Body" element="tns:ArrayOfString"/>
    </wsdl:message>

    <!-- portType 元素-->
    定义了一个接口的入参和出参,每个portType元素实际上对应了一个接口,就像springMVC当中controller当中定义的一个有@RequestMapping注解的方法一样,他描述了这个方法的入参和出参。
    <wsdl:portType name="WeatherWebServiceSoap">
        <wsdl:operation name="getWeatherbyCityName">
            <wsdl:input message="tns:getWeatherbyCityNameSoapIn"/>
            <wsdl:output message="tns:getWeatherbyCityNameSoapOut"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:portType name="WeatherWebServiceHttpGet">
        <wsdl:operation name="getWeatherbyCityName">
            <wsdl:input message="tns:getWeatherbyCityNameHttpGetIn"/>
            <wsdl:output message="tns:getWeatherbyCityNameHttpGetOut"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:portType name="WeatherWebServiceHttpPost">
        <wsdl:operation name="getWeatherbyCityName">
            <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">...</wsdl:documentation>
            <wsdl:input message="tns:getWeatherbyCityNameHttpPostIn"/>
            <wsdl:output message="tns:getWeatherbyCityNameHttpPostOut"/>
        </wsdl:operation>
    </wsdl:portType>

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

            <http:operation location="/getWeatherbyCityName"/>
            <wsdl:input>
                <http:urlEncoded/>
            </wsdl:input>
            <wsdl:output>
                <mime:mimeXml part="Body"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="WeatherWebServiceHttpPost" type="tns:WeatherWebServiceHttpPost">
        <http:binding verb="POST"/>
        <wsdl:operation name="getWeatherbyCityName">
            <http:operation location="/getWeatherbyCityName"/>
            <wsdl:input>
                <mime:content type="application/x-www-form-urlencoded"/>
            </wsdl:input>
            <wsdl:output>
                <mime:mimeXml part="Body"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>


   <!-- service 元素-->
    这里定义的是每个方法具体的访问地址,指向了每个bingding具体绑定的服务地址。
    <wsdl:service name="WeatherWebService">
        <wsdl:port name="WeatherWebServiceSoap" binding="tns:WeatherWebServiceSoap">
            <soap:address location="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"/>
        </wsdl:port>
        <wsdl:port name="WeatherWebServiceSoap12" binding="tns:WeatherWebServiceSoap12">
            <soap12:address location="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"/>
        </wsdl:port>
        <wsdl:port name="WeatherWebServiceHttpGet" binding="tns:WeatherWebServiceHttpGet">
            <http:address location="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"/>
        </wsdl:port>
        <wsdl:port name="WeatherWebServiceHttpPost" binding="tns:WeatherWebServiceHttpPost">
            <http:address location="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

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"

<?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>
    <getWeatherbyCityName xmlns="http://WebXml.com.cn/">
      <theCityName>string</theCityName>
    </getWeatherbyCityName>
  </soap:Body>
</soap:Envelope>


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

<?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>
    <getWeatherbyCityNameResponse xmlns="http://WebXml.com.cn/">
      <getWeatherbyCityNameResult>
        <string>string</string>
        <string>string</string>
      </getWeatherbyCityNameResult>
    </getWeatherbyCityNameResponse>
  </soap:Body>
</soap:Envelope>

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

<?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>
    <getWeatherbyCityName xmlns="http://WebXml.com.cn/">
      <theCityName>string</theCityName>
    </getWeatherbyCityName>
  </soap12:Body>
</soap12:Envelope>

HTTP/1.1 200 OK
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>
    <getWeatherbyCityNameResponse xmlns="http://WebXml.com.cn/">
      <getWeatherbyCityNameResult>
        <string>string</string>
        <string>string</string>
      </getWeatherbyCityNameResult>
    </getWeatherbyCityNameResponse>
  </soap12:Body>
</soap12:Envelope>

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

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns="http://WebXml.com.cn/">
  <string>string</string>
  <string>string</string>
</ArrayOfString>

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

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns="http://WebXml.com.cn/">
  <string>string</string>
  <string>string</string>
</ArrayOfString>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 接口测试讲义 1. 接口测试的类型 主要包含三种测试: Web接口测试, 应用程序接口(API, applicat...
    厲铆兄阅读 28,596评论 1 44
  • 概览 CXF frontends 是一组编程的API,被用来开发和发布webservice。CXF支持两种类型的f...
    JohnShen阅读 1,294评论 2 2
  • WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧.... 问题一 如果...
    Java3y阅读 9,562评论 5 139
  • 开了一天的会,早早收拾东西回家,跑步 十分钟……十五分钟……十八分钟……二十分钟……实在坚持不了了,想死 但是最终...
    齐发财阅读 546评论 0 0
  • 大清早看到UC发布了一篇文章,2017一堆人总结最后一个字:穷!客观上看现代人的贫穷是从社会对比差距、价值观的频道...
    Daniel飞飞阅读 544评论 1 1