【问题标题】:Is there any support for RPC in ClojureScript?ClojureScript 中是否支持 RPC?
【发布时间】:2014-07-10 13:23:09
【问题描述】:

我有一个 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))

【问题讨论】:

  • hoplon.io 看起来不错,但它提供了整个软件包,基本上这意味着我需要完全切换到它。我不是 100% 确定我现在想这样做。关于shoreleave-remote,它似乎是我正在寻找的东西,除了我可以在它上面添加的异步部分。非常感谢!

标签: clojure clojurescript core.async cljx


【解决方案1】:

这是我见过的三个处理 RPC 的库。我对它们中的任何一个都没有丰富的经验,所以请用大量的盐来对待我的 cmets。

  • Castra。最近更新的,有一个很好的自述文件。
  • Fetch。看起来简单、甜美,而且可能就足够了。
  • Shoreleave。我前段时间成功地使用了这个。它运行良好,但几年没有更新。

【讨论】:

  • 虽然我不再从事那个项目,但它仍然是一个很好的答案。谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2023-03-30
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多