WSDL最佳实践

时间:2008-11-11 23:04:47

标签: soap wsdl gsoap

我正在开发一个与第三方集成的SOAP应用程序。我认为这个第三方的WSDL非常奇怪。我对SOAP很新,所以如果没有破坏,我不想让他们去修复它。这里有一些我注意到的事情,我认为它是错误的,虽然我确信它在技术上是一个有效的文件(因此我在标题中写了“最佳实践”)。另外,我使用gSOAP作为我的SOAP库,这可能就是为什么我认为其中一些东西很奇怪(我甚至比gSOAP更新,而不是一般的SOAP)。

  1. 它们在同一个WSDL中为SOAP 1.1和SOAP 1.2指定了接口。这导致gSOAP生成两倍于它需要的类,因为我只会使用1.2。

  2. 他们的所有名称空间都是http://tempuri.org。那不应该那样,对吗?

  3. 尽管定义了一堆RPC调用,但它们的WSDL使用文档格式。我正在考虑要求他们切换到RPC格式,因为似乎gSOAP不会生成为文档格式采用C ++类型参数的方法。相反,它为每个API函数的输入和响应数据创建一个新类。如果我无法解决这个问题,我将不得不在gSOAP内部编写另一层包装,以便为我的应用程序的其余部分提供合理的API。此外,AFAICT,如果他们切换到RPC,将来回的XML将与现在完全相同,所以我认为这不会很困难。

  4. 元素有minOccurs = 0但是当我提交没有它们的请求时,我会收到返回的错误,表明它们是必需的(有时甚至是空指针异常的堆栈跟踪)。如果需要,他们应该将它们指定为minOccurs = 1,对吗?

  5. 几乎所有的Web服务函数都指定一个响应,其中包含一个表示成功的整数(实际上是一个布尔值)和一个错误消息字符串。他们应该为此使用SOAP故障吗?我认为如果这是一个错误,我的应用程序会更容易处理,因为gSOAP会让我非常容易地解决这个问题(并且通过简单的方式打印错误信息)。

  6. 当然,我并不希望这家第三方公司会因为我要求他们改变他们的WSDL。至少我会学到一些东西......据我所知,这些都不是错误甚至是可疑的。谢谢你的帮助。

6 个答案:

答案 0 :(得分:3)

我想对WSDL创建的最佳实践更加一般:

1。合同优先发展
与James相反,我强调使用Contract-First方法,因为它使开发人员能够使用XML的全部功能(限制,模式......),从那里生成代码相当容易任何编程语言。另一个原因是< wsdl:types>中的架构。是两个系统之间相互交谈的合同。如果开发人员从代码创建WSDL,则可能会引入对特定编程语言的技术依赖(数据类型,...)。

2。文件/文字风格
验证RPC编码的SOAP可能很棘手,XPATH查询和XSLT转换也是不可能的,无论如何都不推荐使用这种样式。

RPC / literal也会导致验证XML的问题(特定命名的帐户)约定)。一些SOAP引擎删除了模式定义的命名空间,因此验证变得不可能。

使用Document / literal样式,SOAP主体被完全处理为XML文档,可以以标准方式进行验证,转换和查询。

3。关注点分离
使用< import ..>将模式定义与WSDL文件本身分开。和< include ..>指令。这促进了模式的重用以及将命名空间分离到不同的.xsd文件中,并且还减小了文件的大小;)

答案 1 :(得分:2)

1 - 他们可能认为这是一个功能。 : - )

2 - 那太可怕了。

3 - 很多人推荐这个。它被称为包裹格式。

4 - 你是对的。

5 - 这取决于。从理论上讲,你可能是正确的,但实际上很多SOAP工具包都没有很好的SOAP错误支持,所以他们可能故意选择不使用异常。

答案 2 :(得分:2)

听起来像你试图与之接口的第三方也不知道网络服务。

根据您的描述,这听起来非常典型的Microsoft ASP.NET Web服务实现,第三方编写一些VB或C#来连接他们提供的内容,将其推送到ASP.NET服务器并将其称为一天,取决于ASP.NET引擎根据请求自动生成WSDL。

您可以要求他们不提供SOAP 1.1定义,但我认为他们不会帮助您,因为他们不知道如何。您可以问他们为什么命名空间是tempuri.org而且我确信他们的回答会像“我们必须调查那个”当他们真正想说的时候“它是??”因为他们也不知道为什么。

命名空间由代码中的编译器指令控制,tempuri.org是Microsoft的默认设置(不记得它叫做atm抱歉)。当然,命名空间的值并不重要(除了看起来很奇怪),因为它实际上只是为变量名称解析提供唯一的字符串标识符。也许其他事情可以用类似的方式控制,我不知道,我真的不知道Web服务或ASP.NET或任何这些东西,而不是我自己的技术的忠实粉丝。

答案 3 :(得分:1)

刚刚遇到这个并且发现必须正确地写前缀,前缀必须是一个工作跟随两个连续下划线'youtns__methodname“

例如

typedef double xsd_double;
int ns__add(xsd_double a, xsd_double b, xsd_double &result);
int ns__sub(xsd_double a, xsd_double b, xsd_double &result);
int myns__sqrt(xsd_double a, xsd_double &result);

这将在运行soapcpp2后生成两个wsdl文件: ns.wsdl myns.wsdl

但是你定义了这样的方法(一个下划线)

int ns_add(xsd_double a, xsd_double b, xsd_double &result); // wrong 

spapcpp2不会产生任何结果。

答案 4 :(得分:0)

您遇到的是创建Web服务时典型的第三方懒惰。我想你不会有太多的运气试图用它们推理,但你可以手工编辑WSDL来删除1.1定义。

答案 5 :(得分:0)

首先,没有人真正编写WSDL - 它是由工具生成的。 您的供应商工具可能会为命名空间插入CORRECT URL,并且可能有一些单选按钮 - V1.0,V1.1,Both。 供应商可能有一些现有的非SOAP代码,并使用一些工具将它们包装为SOAP服务。

没有人写WSDL所以你不应该读它!获得一个像样的工具集,类似于SOAPUI将解码WSDL并允许您浏览它而不会爆炸。它的Java,但无论你编写什么语言,它都是最好的测试工具。

我的SOA经验主要是在Java中,就图书馆和工具而言,您可能会被选中。 C ++在这方面可能不太成熟,但实际上听起来问题是工具选择而不是WSDL。在现实世界中,您将看到不完美的WSDL,因此您的工具应该能够以合理的方式处理它。