如何从帖子返回json数据!clojure解放器中的处理程序?

Cur*_*ity 6 clojure liberator

如何使用Clojure Liberator返回json数据?此代码不起作用:

(defresource poster []
         :allowed-methods [:post :options]
         :available-media-types ["application/json"]
         :post!      (fn [ctx] (println "posting..."))
         :handle-created (fn [ctx] {:created "ok"}))
Run Code Online (Sandbox Code Playgroud)

应该在post之后调用handle-created吗?

Tim*_*m X 1

这就是我这样做的方式 - 它似乎有效,但我才刚刚开始使用 Liberator,所以可能有更好或更正确的方法来做到这一点!

我认为您需要的是一个句柄创建的处理程序。例如 -

(defresource shopping-calc
  :allowed-methods [:post]
  :available-media-types ["application/json"]
  :malformed? (fn [context]
                (let [params (get-in context [:request :params])]
                  (or (empty? params)
                      (is-malformed? params))))
  :handle-malformed (fn [context]
                      (let [params (get-in context [:request :params])]
                        (generate-string (handle-malformed-calc params))))
  :handle-created (fn [context]
                    (let [params (get-in context [:request :params])]
                      (generate-string (calculate-total params)))))
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的处理程序创建的处理程序

(defn calculate-total [params]
  {:total (calc params)})
Run Code Online (Sandbox Code Playgroud)

我还使用了ring/json中间件,并在我的开发环境中添加了解放者跟踪工具。Liberator 跟踪工具非常方便,因为它将向响应添加标头,显示 Liberator 的决策点。因此,对于您的问题,它可能表明 Liberator 正在使用默认的句柄创建的处理程序,该处理程序仅返回标头。要返回您自己的 json,您需要定义处理程序。

请注意,我没有使用该帖子!方法。这是因为在这个例子中,我实际上并没有创建某种新的对象/项目,例如向某种商店添加记录。如果你这样做,你可能会使用 post!添加记录并定义句柄创建,然后获取新记录(可能带有其他新字段,例如记录 ID 或时间戳等)并返回它。

我使用:格式错误?并处理格式错误以进行基本的错误检查。如果:格式错误?返回true,调用handle-malformed header,它在json正文中返回错误状态和错误消息。我发现以 json 形式返回错误会很有帮助,这样您就可以在客户端一致地处理所有内容。

我的处理程序和中间件定义如下。请注意,由于我同时提供应用程序和 api 路由,因此它们有点复杂,因为我希望将一些中间件应用于某些路由,并将其他中间件应用于其他路由。在ring/ring-defaults 中还有一个小错误,一旦修复,将会修改一些内容,因为目前我无法使用wrap-defaults site-api 中间件。请注意换行跟踪中间件。

(def app
  (if (env :dev)
    (routes (-> api-routes
                (wrap-reload)
                (wrap-routes wrap-json-params)
                (wrap-routes wrap-defaults api-defaults)
                (wrap-routes wrap-trace :header :ui))
            (-> app-routes
                (wrap-routes wrap-error-page)
                (wrap-routes wrap-exceptions)))
    (routes (-> api-routes
                (wrap-routes wrap-json-params)
                (wrap-routes wrap-defaults api-defaults))
            app-routes)))
Run Code Online (Sandbox Code Playgroud)