在Clojure中使用WSDL

在Clojure中使用WSDL,clojure,wsdl,Clojure,Wsdl,我需要使用WSDLWeb服务,到目前为止,我看到的Java客户端代码看起来臃肿而复杂。我想知道Clojure中是否存在一个更干净的解决方案,以便在Clojure中实现该部分,并向Java代码公开一个更简单的API cd your_project_dir/src wsimport -p some.import.ns http://.../service?wsdl 它将创建/some.import.ns/*.class。因此,您可以在clojure项目中使用它们 (ns your.ns ...

我需要使用WSDLWeb服务,到目前为止,我看到的Java客户端代码看起来臃肿而复杂。我想知道Clojure中是否存在一个更干净的解决方案,以便在Clojure中实现该部分,并向Java代码公开一个更简单的API

cd your_project_dir/src
wsimport -p some.import.ns http://.../service?wsdl
它将创建
/some.import.ns/*.class
。因此,您可以在clojure项目中使用它们

(ns your.ns ...
  (:import [some.import.ns some_WS_Service ...]))

(let [port (-> (some_WS_Service.) 
               .getSome_WS_ServicePort]
  (... (.someMethod port) ...))
查看paos:

轻量级且易于使用的库,用于从WSDL文件构建SOAP客户端


很抱歉,我无法抗拒…我已经重写了
let
以使用线程宏
->
,如下所示:
[port(->(某些服务)。getSome\WS\u服务端口)]
。很好!我没想过。不管怎样,我认为它不会改变任何事情。@JacekLaskowski是的,它看起来更好。再次感谢。@mobyte感谢dude,为我节省了很多时间,您可以使用
wsimport
--keep
开关来保存和使用java文件,但要由lein编译,您需要在project.clj中配置java源路径,如
:java源路径[“src”]
(require '[clj-http.client :as client])
(require '[paos.service :as service])
(require '[paos.wsdl :as wsdl])

(defn parse-response [{:keys [status body] :as response} body-parser fail-parser]
  (assoc response
         :body
         (case status
           200 (body-parser body)
           500 (fail-parser body))))

(let [soap-service   (wsdl/parse "http://www.thomas-bayer.com/axis2/services/BLZService?wsdl")
      srv            (get-in soap-service ["BLZServiceSOAP11Binding" :operations "getBank"])
      soap-url       (get-in soap-service ["BLZServiceSOAP11Binding" :url])
      soap-headers   (service/soap-headers srv)
      content-type   (service/content-type srv)
      mapping        (service/request-mapping srv)
      context        (assoc-in mapping ["Envelope" "Body" "getBank" "blz" :__value] "28350000")
      body           (service/wrap-body srv context)
      resp-parser    (partial service/parse-response srv)
      fault-parser   (partial service/parse-fault srv)]
  (-> soap-url
      (client/post {:content-type content-type
                    :body         body
                    :headers      (merge {} soap-headers)
                    :do-not-throw true})
      (parse-response resp-parser fault-parser)))