如何在 Clojure / Java 中使用 SOAP?
How to work with SOAP in Clojure / Java?
我需要使用 WSDL 文件连接到 SOAP。我在互联网上找到了一些解决方案。例如:
我可以使用 'wsimport -keep -d src path-fo.wsdl' 从 WSDL 生成 Java 类。但它会产生一些问题。
1) 当我使用 wsimport -keep -d src local-file.wsdl
时,wsimport 将生成 Java 类 以及此文件的完整路径。这意味着它只能在我的电脑上工作,而不是其他人,因为路径不同。另外除非我删除这个文件。我可以将 wsimport 与 http:// 一起使用,但有人告诉我最好将 wsdl 文件保留为本地文件。也许我必须将它与 http:// 一起使用,这是一个糟糕的建议。
2) 我想使用相同的代码连接到同一系统的不同实例。所以每次我需要使用不同的 URL 进行 WSDL 连接,但是 url 都被编码到 Java 文件中。
所以我需要的是:
灵活的 SOAP (WSDL) 连接 URL 到 WSDL 文件与同一系统的其他实例对话。
如何在 Clojure 中实现 / Java?
这不是网络搜索的区域,一些建议可以帮助您到达所需的位置。自我教育,可能在大师的帮助下,绝对是有帮助的。我知道这对于不需要定期执行此操作的人来说是个坏消息。像 Eclipse 这样的 IDE,像 CXF 或 Axis2 这样的框架将大有帮助。可以免费下载的 soapUI 是必不可少的。
将此视为资源的开始:Introductory JAX-WS tutorial for Eclipse using a top down approach
在您准备好做出决定之前坚持:wsdl 优先开发和文档文字样式。
毕竟我决定使用 wsimport
(import java.net.URL)
(import javax.xml.namespace.QName)
(import com.example.schema.Auth)
(import javax.xml.ws.Service)
(import com.example.schema.AtomApiService)
(import com.example.schema.AtomApiServicePortType)
(let [url (URL. "https://www.foo.com")
qname (QName. "http://schema.example.com", "AtomApiService")
auth (doto (new Auth) (.setLogin "login") (.setPassword "password"))
service (Service/create url qname)
port (-> service (.getPort AtomApiServicePortType))
orders (-> port (.getOrdersSpecified auth "0" 0 3 0 "2016-03-24 12:00:00"))]
orders)
为什么?
我发现 Apache CXF 和其他解决方案太旧了,使用起来非常不好。即使安装 Apache CXF 也不是那么容易。就像 2000 年的解决方案一样。只是不想使用那样的解决方案。这是我的主观意见!如果您觉得使用 Apache CXF 很舒服,您可能应该使用它。
什么骗了我?
wsimport 在 FooPortType 中生成许多行,如下所示:
@WebMethod(operationName = "GetOrdersStatuses", action = "https://www.foo.com/atom_api/call/atom_api&method=GetOrdersStatuses")
@WebResult(name = "GetOrdersStatusesReturn", partName = "GetOrdersStatusesReturn")
public String getOrdersStatuses(
@WebParam(name = "authenticate", partName = "authenticate")
Auth authenticate);
所以我预计 SOAP 的调用将使用这个 url,但不是!如果我按照我在 post 开头所写的方式创建连接,则此行中的 urls 将被忽略。我认为通常也会忽略,但我没有在 100% 上测试它。但是这条线骗了我。
也许有人可以解释为什么这些行是硬编码的 url。
我需要使用 WSDL 文件连接到 SOAP。我在互联网上找到了一些解决方案。例如:
我可以使用 'wsimport -keep -d src path-fo.wsdl' 从 WSDL 生成 Java 类。但它会产生一些问题。
1) 当我使用 wsimport -keep -d src local-file.wsdl
时,wsimport 将生成 Java 类 以及此文件的完整路径。这意味着它只能在我的电脑上工作,而不是其他人,因为路径不同。另外除非我删除这个文件。我可以将 wsimport 与 http:// 一起使用,但有人告诉我最好将 wsdl 文件保留为本地文件。也许我必须将它与 http:// 一起使用,这是一个糟糕的建议。
2) 我想使用相同的代码连接到同一系统的不同实例。所以每次我需要使用不同的 URL 进行 WSDL 连接,但是 url 都被编码到 Java 文件中。
所以我需要的是:
灵活的 SOAP (WSDL) 连接 URL 到 WSDL 文件与同一系统的其他实例对话。
如何在 Clojure 中实现 / Java?
这不是网络搜索的区域,一些建议可以帮助您到达所需的位置。自我教育,可能在大师的帮助下,绝对是有帮助的。我知道这对于不需要定期执行此操作的人来说是个坏消息。像 Eclipse 这样的 IDE,像 CXF 或 Axis2 这样的框架将大有帮助。可以免费下载的 soapUI 是必不可少的。
将此视为资源的开始:Introductory JAX-WS tutorial for Eclipse using a top down approach
在您准备好做出决定之前坚持:wsdl 优先开发和文档文字样式。
毕竟我决定使用 wsimport
(import java.net.URL)
(import javax.xml.namespace.QName)
(import com.example.schema.Auth)
(import javax.xml.ws.Service)
(import com.example.schema.AtomApiService)
(import com.example.schema.AtomApiServicePortType)
(let [url (URL. "https://www.foo.com")
qname (QName. "http://schema.example.com", "AtomApiService")
auth (doto (new Auth) (.setLogin "login") (.setPassword "password"))
service (Service/create url qname)
port (-> service (.getPort AtomApiServicePortType))
orders (-> port (.getOrdersSpecified auth "0" 0 3 0 "2016-03-24 12:00:00"))]
orders)
为什么?
我发现 Apache CXF 和其他解决方案太旧了,使用起来非常不好。即使安装 Apache CXF 也不是那么容易。就像 2000 年的解决方案一样。只是不想使用那样的解决方案。这是我的主观意见!如果您觉得使用 Apache CXF 很舒服,您可能应该使用它。
什么骗了我? wsimport 在 FooPortType 中生成许多行,如下所示:
@WebMethod(operationName = "GetOrdersStatuses", action = "https://www.foo.com/atom_api/call/atom_api&method=GetOrdersStatuses")
@WebResult(name = "GetOrdersStatusesReturn", partName = "GetOrdersStatusesReturn")
public String getOrdersStatuses(
@WebParam(name = "authenticate", partName = "authenticate")
Auth authenticate);
所以我预计 SOAP 的调用将使用这个 url,但不是!如果我按照我在 post 开头所写的方式创建连接,则此行中的 urls 将被忽略。我认为通常也会忽略,但我没有在 100% 上测试它。但是这条线骗了我。
也许有人可以解释为什么这些行是硬编码的 url。