这是我的做法 - 似乎可行,但我刚开始使用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正在使用默认的handle-created处理程序,它只返回头部。要返回自己的json,您需要定义处理程序。
请注意,我没有使用post!方法。这是因为在这个例子中,我实际上并没有创建某种新的对象/项,比如向某种存储添加记录。如果您正在执行此操作,您可能会使用post!来添加记录,并定义handle-created来获取新记录(可能包括其他新字段,例如记录ID或时间戳等)并将其返回。
我使用:malformed?和handle-malformed进行基本错误检查。如果:malformed?返回true,则调用handle-malformed标头,在json主体中返回错误状态和错误消息。我发现将错误也以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)))
:new? true
可能会有所帮助?(如果你真的想返回201 Created
的话。) - xscnew?
上可能会得到true
。 - Bartors