Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 客户端的环形中间件?_Clojure_Middleware_Ring - Fatal编程技术网

Clojure 客户端的环形中间件?

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

通常,环形中间件与服务器端的使用相关联。 在本文中,我将讨论如何将环形中间件的概念应用于http客户端

一个非常典型的服务器端示例可能如下所示:

(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}}})
因为实际上会有更多的东西,所以我认为在服务器端和客户端都有可重用的中间件是乌托邦式的

尽管这一概念是否对客户有普遍意义仍有待讨论。我在网上找不到任何客户端中间件


服务器端中间件通常位于名称空间
环下。中间件…
我的具体问题是,提供客户端中间件的库是否应该使用此名称空间

除非您相信使用新库的代码可以在客户端和服务器之间完全可移植,否则我觉得使用不同的名称空间会减少混淆。找到一个有趣的名字!:)