我在 Jetty 上部署了一个 Web 服务。我使用 SOAP UI 通过 http://ip:port/DefaultRequestListener?workflow=WsdlCPF&soapAction=Import
之类的链接调用它,它可以工作。
我一直使用在 url 末尾有 ?wsdl 的服务,但现在我很困惑。
为什么url末尾没有?wsdl?
最佳答案
Web 服务端点通常具有如下所示的 URL:
http://server:port/services/myservice
它没有 wsdl
参数。这是 Web 服务本身的 URL,客户端将调用该 URL。
大多数 Web 服务框架都有一个方便的功能,它们将带有 wsdl
url 参数的端点 url 映射到显示该 Web 服务的 WSDL 内容的网页。所以这个网址:
http://server:port/services/myservice?wsdl
就像告诉服务器:“显示此 Web 服务端点的 wsdl 文件”。您在该网页中看到的内容并不是存储在磁盘中的 wsdl 文件,它只是框架生成的 wsdl 内容。
这个功能非常有用,因为如果我们想为该 Web 服务创建客户端,我们不需要去请求 wsdl 文件,我们只需从该 url 获取它即可。
在 SoapUI 中
这一切意味着您将在 SoapUI 中创建一个新项目并告诉他可以在此处找到 wsdl 文件:http://server:port/services/myservice?wsdl
。如果您告诉他 wsdl 文件是:http://server:port/services/myservice
,它将抛出一个错误,因为不是 wsdl 文件。
或者,您可以输入磁盘中 wsdl 文件的位置而不是 URL,它应该创建相同的 ws 客户端。
然后 SoapUI 将读取 wsdl,他将看到 Web 服务的端点是 http://server:port/services/myservice
,因此他将在此处发送请求。
您的网络服务
在您的情况下,由于您已经将 url 参数传递到端点,因此您可以认为您的 Web 服务将在此 url 处调用:
http://ip:port/DefaultRequestListener?workflow=WsdlCPF&soapAction=Import
如果您想查看该 Web 服务的 wsdl,只需向 URL 添加一个 wsdl
参数即可。请注意,就像任何其他 url 查询一样,符号 ?
仅表示 url 在此结束,接下来的字符是由 &
分隔的 url 参数。在您的情况下,您有 3 个参数(工作流程、soapAction 和现在的 wsdl):
http://ip:port/DefaultRequestListener?workflow=WsdlCPF&soapAction=Import&wsdl
now it returns a text like Company type: blah blah... Region: blah blah...
这是wsdl内容,其中当然包括Web服务中使用的xml类型,一切正常。
也许您看起来很奇怪,因为在磁盘中的 wsdl 文件中,它没有显示所有这些类型,而是导入包含这些定义的 xsd
文件。您在浏览器中看到的 wsdl 永远不会有这样的导入,并且将始终显示 wsdl 文件中嵌入的所有类型。
向下滚动所有这些类型定义,您将看到 wsdl 的其余部分。
我希望它有助于澄清最后带有 ?wsdl
的 url 不是 Web 服务,而只是 wsdl 内容。
关于web-services - URL 末尾不带 WSDL 的 SOAP Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33694567/