我有一个ClojureScript应用程序,我想对服务器进行RPC调用,这看起来像客户端的正常函数core.async调用。
为了做到这一点,我根据cljx编写了下面的代码。在RPC定义部分中,我必须将所有要作为RPC公开的服务器端函数添加到客户端。
如果没有样板代码,有没有办法做得更好?
考虑如何改进它我唯一的想法是编写一个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))
答案 0 :(得分:1)
以下是我见过的三个处理RPC的库。我对其中任何一个都没有丰富的经验,所以请大家注意我的评论。
答案 1 :(得分:0)
Clojure有edn数据交换格式,可以使用CQRS作为数据交换方法