这就是我这样做的方式 - 它似乎工作,但我才刚刚开始使用 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)))))
我有一个像这样的处理程序创建的处理程序
(defn calculate-total [params]
{:total (calc params)})
我还使用了 ring/json 中间件,并在我的开发环境中添加了 liberator 跟踪工具。Liberator 跟踪工具非常方便,因为它会在响应中添加标头,显示 Liberator 的决策点。因此,对于您的问题,它可能表明 Liberator 正在使用默认的句柄创建的处理程序,它只返回标头。要返回您自己的 json,您需要定义处理程序。
请注意,我没有使用帖子!方法。这是因为在此示例中,我实际上并没有创建某种新对象/项目,例如将记录添加到某种商店。如果你这样做,你可能会做的是使用 post!添加记录并定义句柄创建然后获取新记录(可能带有其他新字段,例如记录ID或时间戳等)并返回它。
我使用 :malformed? 并且句柄格式错误以进行基本的错误检查。如果:格式错误?返回true,则调用handle-malformed header,在json body中返回错误状态和错误信息。我发现在 json 中返回错误很有帮助,这样您就可以在客户端一致地处理所有内容。
我的处理程序和中间件定义如下。请注意,当我同时提供应用程序和 api 路由时,它们会稍微复杂一些,因为我希望将一些中间件应用于某些路由,而将其他中间件应用于其他路由。ring/ring-defaults 中还有一个小错误,一旦修复,它将修改内容,因为目前我无法使用 wrap-defaults site-api 中间件。注意 wrap-trace 中间件。
(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)))