我正在尝试创建一个端点,它将使用caveman2发送状态代码。
(defroute "/books/" ()
(render-json "Hello"))我找到了函数throw-code,它允许我发送状态代码,但它也不允许我发送响应体。好像是用来处理错误的。
(import 'caveman2:throw-code)
(defroute "/books/" ()
(throw-code 403)
;; This will not respond with "Hello"
(render-json "Hello"))caveman2 github页面讨论了如何使用特定的状态代码进行响应:
设置HTTP头或HTTP状态--在HTTP请求期间有几个特殊变量可用。请求和响应代表请求和响应。如果您熟悉Clack,那么这些是Clack.Request和Clack.Response子类的实例。
(use-package :caveman2)
;; Get a value of Referer header.
(http-referer *request*)
;; Set Content-Type header.
(setf (getf (response-headers *response*) :content-type) "application/json")
;; Set HTTP status.
(setf (status *response*) 304)但是,我不知道如何实例化这些对象或如何导入它们。我找不到一个有用的例子,当我把它放进我的代码中时,它不会编译。
我怎样才能做到这一点?
发布于 2022-08-22 14:32:55
在处理请求时,*response*变量绑定到实例(它是一个特殊变量)。您可以使用以下简短的示例进行实验:
你需要这些系统:
(ql:quickload '(:clack :caveman2))然后:
(defpackage :test-caveman2 (:use :cl))
(in-package :test-caveman2)
(defparameter *web* (make-instance 'caveman2:<app>))
(caveman2:defroute "/hello/" ()
"Hello")
(defparameter *server* (clack:clackup *web*))执行上述代码后,您应该能够在address localhost:5000/hello/上看到一个简单的Hello页面。
现在,让我们创建一个具有不同状态的主体的页面:
(caveman2:defroute "/bye/" ()
;; here *response* is bound to a response object
;; let's change its status
(setf (caveman2:response-status caveman2:*response*) 403)
"403 - Nope")如果您使用浏览器检查,例如火狐中的F12,网络选项卡,您可以看到/bye/的响应状态为403,但是页面也显示了一个主体。
发布于 2022-08-22 05:41:15
您不必实例化它们。这些是已经绑定在defroute函数上下文中的特殊变量。所以,你可以这么做:
(defroute "/books/" ()
(setf (caveman2:response-status caveman2:*response*) 403)
(render-json "Hello"))或者,您可以在包定义中导入caveman2:*response*和caveman2:response-status,并类似于其他caveman2符号(如defroute或render-json )使用它们。
(defroute "/books/" ()
(setf (response-status *response*) 403)
(render-json "Hello"))https://stackoverflow.com/questions/73436058
复制相似问题