![SOAP web服务始终在除一个客户端之外的所有客户端中返回状态500](https://linux22.com/image/1581832/SOAP%20web%E6%9C%8D%E5%8A%A1%E5%A7%8B%E7%BB%88%E5%9C%A8%E9%99%A4%E4%B8%80%E4%B8%AA%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%AD%E8%BF%94%E5%9B%9E%E7%8A%B6%E6%80%81500.png)
我希望有人可以帮助我并就此给我一些提示。
因此,我目前用 Java 开发了一个 portlet 应用程序,它依赖于远程 SOAP 基 webservice。该应用程序发布 xml 以从中获取数据,处理数据,然后将其发布回 webservice。
但出于某种原因,我无法从中获得“正确”的响应或至少是一些预期的结果。我总是得到一个带有代码 500(内部服务器错误)的 SOAP 响应和一些 SOAP 错误消息(由 Web 服务的主机/开发人员定义)。我还确切地知道我应该期待什么响应。
我可以访问文档和 wsdl 文档,因此我非常确定我的请求主体(在 text/xml 中)是正确的。
此外,我设法通过使用 SOAP 客户端从 web 服务获取正确的响应http://www.soapclient.com/soaptest.html(定义 wsdl 并使用生成的 HTML 表单)。但是,当使用任何其他客户端(如 SoapUI、Wizdler(Chrome 扩展程序)或 Postman)或用 Java 实现调用时,我得到的是“状态 500”。
在过去的项目中,至少 SoapUI 对我有用。我还尝试将请求 xml 文档作为一行或美化的 xml 发布,但没有效果。
我无法访问托管 web 服务的服务器,因此无法查看日志等。需要注意的一点是 web 服务使用 https。
另一件事是,文档和托管商的员工告诉我将一个参数附加到 URL,如下所示:'https://主机:端口/path_to_wsdl'-nohostverify 但是我无法明白如何操作,因为没有其他指定。
也许有人以前遇到过类似的问题或对这个问题有所了解。
答案1
我自己解决了这个问题(诚然,这个问题已经过去了一段时间,所以我的解决方案来得相当晚)。对于任何有类似问题的人:
事实证明,Web 服务并不期望纯 xml。请求的相关部分必须是“String”类型,这意味着 soap 主体中的特定 xml 元素不包含其他(常规)xml 元素,而是包含所有特殊字符编码为 HTML 数字的必要 xml 元素。
例子:
<soapenv:Envelope>
<soapenv:Header/>
soapenv:Body>
<urn:webserviceNode>
<requestContent xsi:type="xsd:String">
<subnode_A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<subnode_A1>some_string</subnode_A1>
<subnode_A2>another_string</subnode_A2>
</subnode_A>
</requestContent>
</urn:webserviceNode>
</soapenv:Body>
</soapenv:Envelope>
直到我检查成功请求的响应并发现 Web Soap 客户端屏蔽了 html 编码的 xml 字符后,我才意识到这一点。请注意,此处的引号(以及我们德国的变音符号)也受到影响。
因此,我“仅”需要替换 soap 请求部分中的所有特殊字符,即可发出成功的请求。
我不知道这是否常见,但我怀疑这是一种常见的做法,而且我想不出为什么有必要实现这样的网络服务。
无论如何,案子已经结了。