在Clojure Web服务中寻找匹配路径

时间:2015-09-17 21:58:24

标签: clojure compojure ring clout

我希望我能以这样的方式解释这一点,这是有道理的!

我正在使用Liberator来构建我需要向客户端公开的一些Web服务的原型,并且具有如此定义的路由:

(defroutes fish
  (context "/fish"
           []
           (ANY "/cod/:id/count"
                [id]
                (cod-fish id))))

(def handler
  (-> fish
      wrap-params
      path-wrapper))

path-wrapper的意图是输出有关匹配路径的一些信息。它目前看起来像这样:

(defn path-wrapper
  [handler]
  (fn [request]
    (println "in" (:request-method request) (:uri request))
    (let [response (handler request)]
      (println "out")
      response)))

这打印出你期望的东西:

in :get /fish/cod/123/count
out

但是,我希望打印出来的是:

in :get /fish/cod/:id/count
out

即匹配的路径,而不是匹配它的URI。

我几乎可以肯定答案是在Clout的某处,但我似乎无法找到它! :(

有什么建议吗?

干杯,

彼得

1 个答案:

答案 0 :(得分:0)

在这种情况下,我喜欢输入如下的调试语句:

(let [response .... ]
    (log/errorf "in: request was: %s" 
       (with-out-str (clojure.pprint/pprint request))
 ....

并在输出中查找所需的数据(然后删除语句),或者如果您有一个工作和现代的emacs + cider环境,您可以使用 Cu 向函数添加调试抄送 抄送并捕获请求的那种方式。如果您不可用的数据可能会在该输出中。如果您没有使用日志记录框架,则删除日志和with-out-str部分,然后直接调用pprint。

很抱歉,如果我误解了,或者问题可能是错字:

(let [response handler]
      (println "out")
      response)

看起来它正在返回处理程序本身,而不是调用该处理程序的结果,如果它是:

(let [response (handler request)]
      (println "out")
       response)