soap - WSDL 最佳实践

标签 soap wsdl gsoap

我正在开发一个与第 3 方集成的 SOAP 应用程序。我觉得这个第三方的 WSDL 很奇怪。我对 SOAP 很陌生,所以如果它没有损坏,我不想去要求他们修复它。以下是我注意到的一些我认为错误的事情,尽管我确信它在技术上是一个有效的文档(因此我在标题中写了“最佳实践”)。另外,我使用 gSOAP 作为我的 SOAP 库,这可能就是为什么我认为其中一些东西很奇怪(我对 gSOAP 的了解甚至比对 SOAP 的了解还要新)。

  • 它们在同一个 WSDL 中为 SOAP 1.1 和 SOAP 1.2 指定了接口(interface)。这会导致 gSOAP 生成两倍于它需要的类,因为我只打算使用 1.2。
  • 他们所有的命名空间都是http://tempuri.org .那不应该是这样的,对吧?
  • 尽管定义了一堆 RPC 调用,但它们的 WSDL 使用文档格式。我正在考虑要求他们切换到 RPC 格式,因为 gSOAP 似乎不会生成将 C++ 类型参数用于文档格式的方法。相反,它为每个 API 函数的输入和响应数据创建一个新类。如果我不能解决这个问题,我将不得不编写另一层包裹 gSOAP 的东西,以便为我的应用程序的其余部分提供合理的 API。此外,AFAICT,如果他们切换到 RPC,将来回传输的 XML 将与现在完全相同,所以我认为这并不困难。
  • 元素具有 minOccurs = 0 但是当我在没有它们的情况下提交请求时,我得到返回的错误表明它们是必需的(有时甚至是空指针异常的堆栈跟踪)。如果需要,他们应该将它们指定为 minOccurs = 1,对吗?
  • 几乎所有的 Web 服务函数都指定了一个响应,其中包括一个表示成功的整数(实际上是一个 bool 值)和一个错误消息字符串。他们应该为此使用 SOAP 错误吗?我认为如果它是一个错误,我的应用程序会更容易处理,因为 gSOAP 会让我很容易地解决这个问题(并简单地打印错误消息)。

  • 当然,我不希望这家第 3 方公司仅仅因为我要求他们就改变他们的 WSDL。至少我会学到一些东西……据我所知,这些都不是错误的,甚至没有问题。谢谢你的帮助。

    最佳答案

    我想对创建 WSDL 的最佳实践稍微概括一点:

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

    2.文档/文字风格
    验证 RPC 编码的 SOAP 可能很棘手,XPATH 查询和 XSLT 转换也是不可能的,而且这种风格无论如何都被弃用了。RPC/literal 也会导致验证 XML 的问题(考虑到某些命名约定)。一些 SOAP 引擎放弃了模式定义的命名空间,因此验证变得不可能。使用 Document/literal 样式,SOAP 主体完全作为 XML 文档处理,可以以标准方式验证、转换和查询。

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

    关于soap - WSDL 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/282448/

    相关文章:

    java - 部署 Tomcat 后在 WSDL 中重新安排 soap 操作

    java - 通过 Java 给出准备好的 SOAP 响应

    php - wsdl模式和非wsdl模式web服务有什么区别?

    java - 当 WSDL 太大时,JAX-WS 客户端挂起 30 秒

    c - 用 C/C++ 编写 Web 服务

    c++ - 如何使用 c++ 客户端/服务器在 openssl 中与 gsoap 一起使用 ssl 证书

    java - xadditionalHeaders 不适用于 maven 中的 wsimport 目标

    java - BeanDeserializer 警告 : How to get rid of them?

    c++ - 如何使用gsoap在客户端无冲突地调用多个服务

    java - 尝试查找 com.predic8.wsdl.WSDLParser 类所在的 jar