gpt4 book ai didi

common-lisp - Hunchentoot 通过 HTTP 方法调度

转载 作者:行者123 更新时间:2023-12-02 17:43:40 24 4
gpt4 key购买 nike

我找不到任何有关如何基于 HTTP 方法(在同一 uri 上)进行调度的文档。我得到的最接近的是 define-easy-handler 上的 :default-request-type ——但它似乎分派(dispatch)给后者,即使我使用 GET 方法:

(define-easy-handler (index :uri "/" :default-request-type :get) ()
(log-message* :info "GET on index ------ ")
(format nil "Hello World"))

(define-easy-handler (echo :uri "/" :default-request-type :post) ()
(log-message* :info "POST on index ------ ")
(format nil "~S" (raw-post-data :force-text t)))

最佳答案

(名称可能有点欺骗性):uri 参数允许是请求对象上的字符串或谓词。因此,您可以在那里传递一个函数来检查方法和路径是否匹配。我写了一个宏来使它更漂亮:

(defmacro method-path (methods path)
"Expands to a predicate the returns true of the Hunchtoot request
has a SCRIPT-NAME matching the PATH and METHOD in the list of METHODS.
You may pass a single method as a designator for the list containing
only that method."
(declare
(type (or keyword list) methods)
(type string path))
`(lambda (request)
(and (member (hunchentoot:request-method* request)
,(if (keywordp methods)
`'(,methods)
`',methods))
(string= (hunchentoot:script-name* request)
,path))))

(hunchentoot:define-easy-handler (get-handler :uri (method-path :get "/hello")) ()
"hello!")

(hunchentoot:define-easy-handler (post-handler :uri (method-path (:post :put) "/hello")) ()
"a post or a put!")

在找到路径但未找到方法的情况下,我们可能应该返回 HTTP 405 错误,而不是 Hunchentoot 在没有处理程序匹配时返回的 404 错误。为此,您可以为您定义的每个路径手动编写一个包罗万象的处理程序。 405 响应应该包含可接受的方法列表,并且我想不出一种简单的方法来生成一个缺少修改 define-easy-handler 来直接支持方法特化的方法,这可能是个好主意。

关于common-lisp - Hunchentoot 通过 HTTP 方法调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19061721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com