我见过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类并以这种方式发送请求,那么服务器是否会将传入视为与上面所做的不同?
答案 0 :(得分:2)
创建像这样的SOAP请求没有固有的问题,但是存在一些缺陷:
SOAP服务不会看到使用WSDL /数据绑定的客户端和以其他方式创建SOAP请求的代码之间的任何差异。只要您的请求与请求架构匹配,并且您设置了SOAP-Action HTTP标头,就应该没问题。
在某些情况下,有一个很好的论据是不使用WSDL,其中你的组件是一个消息代理(例如中间件),需要接收和转发不同消息类型的负载,其中一些甚至可能没有WSDL 。的定义。
答案 1 :(得分:1)
SOAP主要用于拥有数百个SOAP服务的企业环境,并且自动生成客户端存根是必需的。
从给定的WSDL生成客户端存根更简单,所有DTO对象都考虑了所有限制,例如可空/非可空字段,复杂字段,集合等。
如果合同可能包含数十个不同类型的字段,并且其中许多是具有自己字段的集合或复杂类型,那么如何手动为CreateContract请求构建信封? 当您需要将主体转换为POJO
时,返回的响应GetContract也是如此如果您只需要使用单个参数调用单个方法,您可能会发现使用参数的占位符更难以硬编码soap信封。它取决于你。
WSDL只是客户端和服务器之间的契约。对于服务器而言,无论是手工还是自动生成的代码,请求体的组成方式都无关紧要。如果请求符合合同服务器,则应接受它。
您始终可以检查手工制作的请求以确保与WSDL的一致性,并使用SoapUI
等工具对其进行测试