Clojure 如何在compojure with Liberator中处理一些但不是所有的http方法?
我正在将liberator与compojure一起使用,并希望向save资源发送多个方法(但不是所有方法)。我不想重复我自己的话,我希望有一个可以同时定义多个处理程序的东西 例如:Clojure 如何在compojure with Liberator中处理一些但不是所有的http方法?,clojure,compojure,liberator,Clojure,Compojure,Liberator,我正在将liberator与compojure一起使用,并希望向save资源发送多个方法(但不是所有方法)。我不想重复我自己的话,我希望有一个可以同时定义多个处理程序的东西 例如: (defroutes abc (GET "/x" [] my-func) (HEAD "/x" [] my-func) (OPTIONS "/x" [] my-func)) 应更接近: (defroutes abc (GET-HEAD-OPTIONS "/x" [] my-func)) 在几次错
(defroutes abc
(GET "/x" [] my-func)
(HEAD "/x" [] my-func)
(OPTIONS "/x" [] my-func))
应更接近:
(defroutes abc
(GET-HEAD-OPTIONS "/x" [] my-func))
在几次错误启动之后,我意识到compojure.core/context宏可以用于此目的。我定义了以下宏:
(defmacro read-only "Generate a route that matches HEAD, GET, or OPTIONS"
[path args & body]
`(context "" []
(GET ~path ~args ~@body)
(HEAD ~path ~args ~@body)
(OPTIONS ~path ~args ~@body)))
这将让你做到:
(read-only "/x" [] my-func)
而且似乎做了我需要的。在几次错误的开始之后,我意识到compojure.core/context宏可以用于此目的。我定义了以下宏:
(defmacro read-only "Generate a route that matches HEAD, GET, or OPTIONS"
[path args & body]
`(context "" []
(GET ~path ~args ~@body)
(HEAD ~path ~args ~@body)
(OPTIONS ~path ~args ~@body)))
这将让你做到:
(read-only "/x" [] my-func)
而且似乎做了我需要的。在几次错误的开始之后,我意识到compojure.core/context宏可以用于此目的。我定义了以下宏:
(defmacro read-only "Generate a route that matches HEAD, GET, or OPTIONS"
[path args & body]
`(context "" []
(GET ~path ~args ~@body)
(HEAD ~path ~args ~@body)
(OPTIONS ~path ~args ~@body)))
这将让你做到:
(read-only "/x" [] my-func)
而且似乎做了我需要的。在几次错误的开始之后,我意识到compojure.core/context宏可以用于此目的。我定义了以下宏:
(defmacro read-only "Generate a route that matches HEAD, GET, or OPTIONS"
[path args & body]
`(context "" []
(GET ~path ~args ~@body)
(HEAD ~path ~args ~@body)
(OPTIONS ~path ~args ~@body)))
这将让你做到:
(read-only "/x" [] my-func)
并且似乎做了我需要的。如图所示,惯用的方法是使用路由上的任意键,然后在资源上定义:允许的方法[:get:head:options]
。您需要实现:handle ok
和:handle选项
(defroute collection-example
(ANY ["/collection/:id" #".*"] [id] (entry-resource id))
(ANY "/collection" [] list-resource))
(defresource list-resource
:available-media-types ["application/json"]
:allowed-methods [:get :post]
:known-content-type? #(check-content-type % ["application/json"])
:malformed? #(parse-json % ::data)
:handle-ok #(map (fn [id] (str (build-entry-url (get % :request) id)))
(keys @entries)))
如图所示,惯用的方法是在路由上使用ANY
键,然后在资源上定义:允许的方法[:get:head:options]
。您需要实现:handle ok
和:handle选项
(defroute collection-example
(ANY ["/collection/:id" #".*"] [id] (entry-resource id))
(ANY "/collection" [] list-resource))
(defresource list-resource
:available-media-types ["application/json"]
:allowed-methods [:get :post]
:known-content-type? #(check-content-type % ["application/json"])
:malformed? #(parse-json % ::data)
:handle-ok #(map (fn [id] (str (build-entry-url (get % :request) id)))
(keys @entries)))
如图所示,惯用的方法是在路由上使用ANY
键,然后在资源上定义:允许的方法[:get:head:options]
。您需要实现:handle ok
和:handle选项
(defroute collection-example
(ANY ["/collection/:id" #".*"] [id] (entry-resource id))
(ANY "/collection" [] list-resource))
(defresource list-resource
:available-media-types ["application/json"]
:allowed-methods [:get :post]
:known-content-type? #(check-content-type % ["application/json"])
:malformed? #(parse-json % ::data)
:handle-ok #(map (fn [id] (str (build-entry-url (get % :request) id)))
(keys @entries)))
如图所示,惯用的方法是在路由上使用ANY
键,然后在资源上定义:允许的方法[:get:head:options]
。您需要实现:handle ok
和:handle选项
(defroute collection-example
(ANY ["/collection/:id" #".*"] [id] (entry-resource id))
(ANY "/collection" [] list-resource))
(defresource list-resource
:available-media-types ["application/json"]
:allowed-methods [:get :post]
:known-content-type? #(check-content-type % ["application/json"])
:malformed? #(parse-json % ::data)
:handle-ok #(map (fn [id] (str (build-entry-url (get % :request) id)))
(keys @entries)))
我看到了这一点,但这似乎排除了在另一个资源中处理其他方法,因为它们将被路由到该资源,被允许的方法过滤器回击。我也不希望资源中的大多数决策函数(比如畸形?)必须检查正在使用的HTTP方法。我会尝试用一个更完整的例子来更新我的问题。我明白你的意思,在这种情况下,你自己的答案似乎已经足够好了。如果您有进一步的需要,另一种选择是使用公共基础资源的继承。我期待着在邮件列表上看到的公共资源配置。我认为这也会起作用。谢谢这是定义基本资源的一个很好的灵感来源,也是一个很好的约定,感谢我看到了这一点,但这似乎排除了在另一个资源中处理其他方法,因为它们将被路由到资源,被允许的方法过滤器回击。我也不希望资源中的大多数决策函数(比如畸形?)必须检查正在使用的HTTP方法。我会尝试用一个更完整的例子来更新我的问题。我明白你的意思,在这种情况下,你自己的答案似乎已经足够好了。如果您有进一步的需要,另一种选择是使用公共基础资源的继承。我期待着在邮件列表上看到的公共资源配置。我认为这也会起作用。谢谢这是定义基本资源的一个很好的灵感来源,也是一个很好的约定,感谢我看到了这一点,但这似乎排除了在另一个资源中处理其他方法,因为它们将被路由到资源,被允许的方法过滤器回击。我也不希望资源中的大多数决策函数(比如畸形?)必须检查正在使用的HTTP方法。我会尝试用一个更完整的例子来更新我的问题。我明白你的意思,在这种情况下,你自己的答案似乎已经足够好了。如果您有进一步的需要,另一种选择是使用公共基础资源的继承。我期待着在邮件列表上看到的公共资源配置。我认为这也会起作用。谢谢这是定义基本资源的一个很好的灵感来源,也是一个很好的约定,感谢我看到了这一点,但这似乎排除了在另一个资源中处理其他方法,因为它们将被路由到资源,被允许的方法过滤器回击。我也不希望资源中的大多数决策函数(比如畸形?)必须检查正在使用的HTTP方法。我会尝试用一个更完整的例子来更新我的问题。我明白你的意思,在这种情况下,你自己的答案似乎已经足够好了。如果您有进一步的需要,另一种选择是使用公共基础资源的继承。我期待着在邮件列表上看到的公共资源配置。我认为这也会起作用。谢谢这是定义基本资源的一个很好的灵感来源,也是一个很好的约定,这对于我的特定用例来说效果更好,但是James的代码和注释显示了一个很好的方法来处理它,如果它对您有效的话。这对于我的特定用例来说效果更好,但是James的代码和注释显示了一个很好的方法来处理它,如果它对您有效。这对我的特定用例更有效,但是James的代码和注释显示了一个很好的方法来处理它,如果它对您有效。这对我的特定用例更有效,但是James的代码和注释显示了一个很好的方法来处理它。