SOAP客户端是否真的需要使用WSDL?

时间:2016-10-21 14:34:28

标签: java web-services soap wsdl

我见过SOAP客户端的例子,它们只是将SOAP信封的XML有效负载作为HTTP请求体发送出去......

 String payload="""
    <soapenv:Envelope>
       <soapenv:Header/>
          <soapenv:Body>
               Some soap crapola
    </soapenv:Body>
  </soapenv:Envelope>
   """

    HttpPost httpPost = new HttpPost("somecraapysoapwebsevice.com/biteme");

    StringEntity entity = new StringEntity(payload);
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "text/xml");
    httpPost.setHeader("Content-type", "text/xml");

    HttpResponse response = httpclient.execute(httpPost);

此代码不会打扰WSDL。这种方法有问题吗?

此外,如果我使用WSDL生成Java类并以这种方式发送请求,那么服务器是否会将传入视为与上面所做的不同?

2 个答案:

答案 0 :(得分:2)

创建像这样的SOAP请求没有固有的问题,但是存在一些缺陷:

  1. 如果要调用的服务的schema / wsdl发生更改,则必须在创建SOAP请求的代码中反映出来。如果使用WSDL,则只需使用更新WSDL /模式重新运行数据绑定器。
  2. 使用字符串创建和解析XML并不是一个好主意。您应该使用DOM,并在将其发送到HTTP / SOAP请求之前将其序列化。
  3. SOAP服务不会看到使用WSDL /数据绑定的客户端和以其他方式创建SOAP请求的代码之间的任何差异。只要您的请求与请求架构匹配,并且您设置了SOAP-Action HTTP标头,就应该没问题。

    在某些情况下,有一个很好的论据是不使用WSDL,其中你的组件是一个消息代理(例如中间件),需要接收和转发不同消息类型的负载,其中一些甚至可能没有WSDL 。的定义。

答案 1 :(得分:1)

SOAP主要用于拥有数百个SOAP服务的企业环境,并且自动生成客户端存根是必需的。

从给定的WSDL生成客户端存根更简单,所有DTO对象都考虑了所有限制,例如可空/非可空字段,复杂字段,集合等。

如果合同可能包含数十个不同类型的字段,并且其中许多是具有自己字段的集合或复杂类型,那么如何手动为CreateContract请求构建信封? 当您需要将主体转换为POJO

时,返回的响应GetContract也是如此

如果您只需要使用单个参数调用单个方法,您可能会发现使用参数的占位符更难以硬编码soap信封。它取决于你。

WSDL只是客户端和服务器之间的契约。对于服务器而言,无论是手工还是自动生成的代码,请求体的组成方式都无关紧要。如果请求符合合同服务器,则应接受它。

您始终可以检查手工制作的请求以确保与WSDL的一致性,并使用SoapUI

等工具对其进行测试