Clojure 客户端的环形中间件?
通常,环形中间件与服务器端的使用相关联。 在本文中,我将讨论如何将环形中间件的概念应用于http客户端 一个非常典型的服务器端示例可能如下所示:Clojure 客户端的环形中间件?,clojure,middleware,ring,Clojure,Middleware,Ring,通常,环形中间件与服务器端的使用相关联。 在本文中,我将讨论如何将环形中间件的概念应用于http客户端 一个非常典型的服务器端示例可能如下所示: (def server (-> server-handler wrap-transit-params wrap-transit-response)) (defn wrap-transit-params [handler] (fn [req] (handler (assoc req :body (to-tr
(def server
(-> server-handler
wrap-transit-params
wrap-transit-response))
(defn wrap-transit-params [handler]
(fn [req]
(handler (assoc req :body (to-transit-str (req :params))))))
(defn wrap-transit-response [handler]
(fn [req]
(let [resp (handler req)]
(update resp :body from-transit-str))))
(client {:url "http://..."
:params {:one #{1 2 3}}})
脱去糖衣:
(def server (wrap-transit-response (wrap-transit-params handler)))
server
现在是一个函数,它接受请求哈希映射。中间件可以在数据发送到处理程序之前对其进行操作。它还可以对处理程序返回的响应哈希映射进行操作。或者两者兼而有之。它甚至可以操纵处理程序的执行
服务器
上述中间件可以以非常简单的方式如下所示:
(1.)这会在数据到达实际处理程序(请求、传入数据)之前对其进行操作,解析主体并将结果作为值提供给:params键。这叫做预包装
(defn wrap-transit-params [handler]
(fn [req]
(handler (assoc req :params (from-transit-str (req :body))))))
(2.)这一个操作传出数据、服务器响应、传出数据。-这是邮包
(defn wrap-tranist-response [handler]
(fn [req]
(let [resp (handler req)]
(update resp :body to-transit-str))))
通过这种方式,服务器可以在传输过程中接收和响应数据
客户端
对于http客户机,同样的行为也是可取的
(def client
(-> client-handler
wrap-transit-params
wrap-transit-response))
事实证明,即使存在一些对称性,上述中间件也不能轻松地重用为客户机中间件
对于客户端,它们的实现应如下所示:
(def server
(-> server-handler
wrap-transit-params
wrap-transit-response))
(defn wrap-transit-params [handler]
(fn [req]
(handler (assoc req :body (to-transit-str (req :params))))))
(defn wrap-transit-response [handler]
(fn [req]
(let [resp (handler req)]
(update resp :body from-transit-str))))
(client {:url "http://..."
:params {:one #{1 2 3}}})
现在可以这样使用:
(def server
(-> server-handler
wrap-transit-params
wrap-transit-response))
(defn wrap-transit-params [handler]
(fn [req]
(handler (assoc req :body (to-transit-str (req :params))))))
(defn wrap-transit-response [handler]
(fn [req]
(let [resp (handler req)]
(update resp :body from-transit-str))))
(client {:url "http://..."
:params {:one #{1 2 3}}})
因为实际上会有更多的东西,所以我认为在服务器端和客户端都有可重用的中间件是乌托邦式的
尽管这一概念是否对客户有普遍意义仍有待讨论。我在网上找不到任何客户端中间件
服务器端中间件通常位于名称空间
环下。中间件…
我的具体问题是,提供客户端中间件的库是否应该使用此名称空间 除非您相信使用新库的代码可以在客户端和服务器之间完全可移植,否则我觉得使用不同的名称空间会减少混淆。找到一个有趣的名字!:)