// 先啰嗦一堆我的心理历程嘛~~
我这个野生程序员,基本一路摸爬滚打用啥学啥,基础差的狠。一直基于linux开发,基本就应用层那点东西。之前做过一个小的服务,是我司和某所合作写的一个交互服务,wsdl文件是由对方提供的。我这边只负责用gsoap开源的东西,编译wsdl文件,转换成C框架,然后在C框架中实现一些功能性的东西。
最近某司把某所的项目撬了,然后我司就要跟某司合作写这个交互服务,然而某司开发非常。。。。反正就是不给我们提供wsdl了。说别的公司跟他们合作都没要求过wsdl,人家都用java生写。但是我明明有现成的框架可以用,我为什么要生写一套交互服务。(╯▔皿▔)╯ 心里画圈圈诅咒某司研发,然后狠狠心,我捋捋这个wsdl规则,我自己写嘛~ 妈耶皇天不负有心人,一天半的时间我搞出来了,哈哈哈哈!!!!
// 书归正传
1、wsdl组成部分
① <definitions>定义了文档中用到的各个xml元素的namespace缩写,也界定了本文档自己的 targetNamespace。这意味着其它的XML要引用当前XML中的元素时,要声 明这个namespace。注意xmlns:tns这个声明,它标示了使用tns这个前缀 指向自身的命名空间,跟targetNamespace是一致的。另外若<schema>的namespace与targetNamespace不一致,需要增加一个xmlns:ns1声明。
② <types>标签定义了当前的WSDL文档用到的数据类型。要说明的是,为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。这些数据类型用来定义web service方法的参数和返回值。对于通用的原生数据类型如:integer , boolean , char , float等,在W3C的标准文档http://www.w3.org/2001/XMLSchema中已经做了定义。可以直接定义element内容,也可以通过import方式导入。
③ <message>元素定义了web service函数的参数,引用<types>标签内容。<message>元素中的每个<part>子元素都和某个参数相符。输入参数input在<message>元素中定义,与输出参数output相隔离,输出参数有自己的<message>元素。兼作输入、输出的参数在输入输出的<message>元素中有它们相应的<part>元素。输出 <message>元素以"Response"结尾。message标签的name属性通常使用web service函数方法名作为参照。message标签的参数类型将引用types标签的定义。
④ <portType>记录webservice的执行操作,引用<message>标签内容。在<operation>元素中,name属性表示服务方法名,parameterOrder属性表示方法的参数顺序,使用空格符分割多个参 数,如:“parameterOrder="person arg1”。<operation>元素的子标签<input>表示输入参数说明,它引用<message>标签中的输入参 数。<output>表示输出参数说明,它引用<message>标签中的输出参数。<fault>标签在Java方法中的特别 用来表示异常(其它语言有对应的错误处理机制),它引用<message>标签中的错误参数。
⑤ <binding>标签是完整描述协议、序列化和编码的地方,<types>,<message>和<portType>标签处理抽象的数据内容,而<binding>标签是处理数据传输的物理实现。<binding>标签把前三部分的抽象定义具体化。首先<binding>标签使用<soap:binding>的transport和style属性定义了Web Service的通讯协议HTTP和SOAP的请求风格RPC。其次<operation>子标签将portType中定义的 operation同SOAP的请求绑定,定义了操作名称soapAction,输出输入参数和异常的编码方式及命名空间。
⑥ < service >WSDL服务地址绑定元素。 service是一套<port>元素。在一一对应形式下,每个<port>元素都和一个location关联。如果同一个<binding>有多个<port>元素与之关联,可以使用额外的URL地址作为替换。一个WSDL文档中可以有多个<service>元素,而且多个<service>元素十分有用,其中之一就是可以根据目标URL来组织端口。在一个 WSDL文档中,<service>的name属性用来区分不同的service。在同一个service中,不同端口,使用端口的"name"属性区分。
2、如何快速写自己服务的wsdl文件
老油条表示,用模板改啊,哇哈哈哈哈哈O(∩_∩)O 给一个模板链接,把第一步中五个必要元素补全,就OKK啦~~
https://download.oracle.com/otn_hosted_doc/jdeveloper/1012/web_services/ws_wsdlexample.html
3、路上的坑
在完全不懂xml语法的情况下,用一天半写了有五个接口的文档,真是走了好远的弯路,踩了一个个坑啊。
① 域名namespace。我编辑<types>的时候,namespace与上一层声明的不一致,每次用wsdl命令行生成.h文件都会报错域名下找不到某某某定义。盯着域名看很久,发现妈呀,写错字母了。。。。有多级域名的时候,引用元素要标注好域名啊!!!!这个红圈圈就是我在<definitions>中声明的tns,及ns1.
② 编辑顺序,我觉得从下往前捋着写比较顺利。当然这是我这种完全不懂的小白最适合的方法。据说可以用jxs直接生成wsdl,我完全不懂啊┭┮﹏┭┮ 因为主业不是写服务的,所以我暂时放弃学习怎么自动生成wsdl了。