在ClojureScript中是否支持RPC?

时间:2014-07-10 13:23:09

标签: clojure clojurescript core.async cljx

我有一个ClojureScript应用程序,我想对服务器进行RPC调用,这看起来像客户端的正常函数core.async调用。

为了做到这一点,我根据cljx编写了下面的代码。在RPC定义部分中,我必须将所有要作为RPC公开的服务器端函数添加到客户端。

注意:发送功能取自此处:https://dimagog.github.io/blog/clojure/clojurescript/2013/07/12/making-http-requests-from-clojurescript-with-core.async/

如果没有样板代码,有没有办法做得更好?

考虑如何改进它我唯一的想法是编写一个leiningen插件,它生成RPC所需的服务器端和客户端代码,即我此时使用cljx做的部分。还有更好的方法吗?

(ns myapp.shared.rpc
  (:require
     #+cljs [myapp.tools :refer [send log]]
     #+cljs [cljs.reader :as reader]
     #+clj  [clojure.tools.logging :as log]
     #+clj  [noir.response :refer [edn]]
     #+clj  [myapp.rpc :as rpc]
   ))

#+cljs (defn rpc-client [function params]
#+cljs   (log "RPC call: (" function params ")")
#+cljs   (send "POST" "/api"
#+cljs         (str "rpc=" (pr-str {:fun function :params params}))
#+cljs         (fn [x]
#+cljs           (log "RPC response:'" x "'")
#+cljs           (:response (reader/read-string x)))))


#+clj (defmulti rpc-impl #(:fun %))

#+clj (defn rpc-server [{rpc :rpc}]
#+clj    (log/info "RPC call received:" rpc)
#+clj    (let [response (-> rpc read-string rpc-impl)]
#+clj      (log/info "RPC response sent: '" response "'")
#+clj      (edn {:response response})))




;;;;; RPC definitions


#+cljs (defn demo [ & p]  (rpc-client :demo p))
#+clj  (defmethod rpc-impl :demo [{p :params}] (apply rpc/demo p))

2 个答案:

答案 0 :(得分:1)

以下是我见过的三个处理RPC的库。我对其中任何一个都没有丰富的经验,所以请大家注意我的评论。

  • Castra。最新更新,并有一个很好的自述。
  • Fetch。看起来简单,甜美,可能就足够了。
  • Shoreleave。我成功地使用了这个。它工作正常,但几年后没有更新。

答案 1 :(得分:0)

Clojure有edn数据交换格式,可以使用CQRS作为数据交换方法