我是否可以在WSDL中相对于WSDL位置使用soap:address位置,或者至少相对于服务器? 例如,我想写:
<soap:address location="https://exampleserver.com/axis2/services/ExampleService" />
as:
<soap:address location="/axis2/services/ExampleService" />
这样可以更快地部署到多个服务器,例如测试服务器。另外,对于axis2c,如果我希望从HTTP或HTTPS使用我的服务,那么使用我的服务的开发人员的生活变得更加困难,因为他们不能简单地从它的默认位置“?WSDL”导入WSDL。
答案 0 :(得分:7)
WSDL向客户端描述了与Web服务交互所需的消息格式,类型,参数等。然后,像WSDL2C这样的工具使用它来生成交互所需的代码。
但即使您在HTTP或HTTPS上公开您的服务,客户端存根代码也是相同的。 您不会为每个端点地址重新生成客户端存根。客户端保持不变,这是更改的接入点。
此地址不应在生成的客户端代码中进行硬编码,而必须是客户端应用程序中的可配置URL。
当然,您在WSDL中指定了一个URL,当您在开发服务器中部署Web服务,然后进行暂存和下一次生产时,这是一个麻烦。端点在每个环境中都会有所不同(对于HTTP + HTTPS,可能会乘以2),但此时您的开发人员不会受到影响,因为您不会重新生成代码。
当涉及到访问Web服务时,你仍然会有不同的地址(对于dev,staging和prod服务器),即使它是相对于某些东西或绝对的。因此,我不知道在WSDL中拥有相对地址是如何有用的,因为您仍然需要将访问点管理到客户端配置中。
答案 1 :(得分:4)
获取WSDL有两种方法。
提供硬编码wsdl的地方,例如:
https://hostname/contextname/services/myAPIService/myAPI.wsdl
和另一个生成wsdl的服务,例如:
https://hostname/contextname/services/myAPIService?wsdl
如果您使用动态选项,它将使用此代码:
req.getRequestURL().toString();
获取将在生成的WSDL中使用的URL。此代码位于ListingAgent类中(在包org.apache.axis2.transport.http中)。
根据您在问题中提到的内容,如果您想拥有相对位置,那一定是因为您想在多个服务器中使用它,因此您需要使用动态选项。
我发现动态选项的一个问题是,如果在原始WSDL中该位置使用HTTP,那么即使您使用HTTPS访问它,在生成的位置仍会使用HTTP。 (这发生在我的项目正在使用的版本1.5中)
另一个问题是如果您使用的是负载均衡器,因为生成的WSDL将使用最终服务器的位置而不是平衡器生成。一个选项是扩展AxisServlet和ListingAgent类来替换上面提到的代码。
答案 2 :(得分:3)
经过长时间的搜索,我几乎可以确定soap:address
的{{1}}属性必须是绝对网址。如果您使用不同的环境(例如开发,测试和生产),这会使事情变得更加复杂。
可能一种解决方法是在客户端读取配置文件中URL的第一部分(例如location
)和WSDL的最后部分(例如https://exampleserver.com
)和将它们结合起来构建绝对路径。前者允许您在不同环境之间切换。