common-lisp - 如何使用 Caveman2 设置响应状态代码?

标签 common-lisp special-variables

我正在尝试创建一个端点,该端点将使用 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"))

穴居人2 github page讨论使用特定状态代码进行响应:

Set HTTP headers or HTTP status

HTTP 请求期间有几个可用的特殊变量。 requestresponse代表请求和响应。如果您熟悉 Clack,这些是 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)

但是,我不知道如何实例化这些对象或如何导入它们。我找不到有效的示例,当我将其按原样放入代码中时,它将无法编译。

我怎样才能做到这一点?

最佳答案

您不必实例化它们。这些是已经绑定(bind)在 defroute 函数上下文中的特殊变量。所以,你可以这样做:

(defroute "/books/" ()
  (setf (caveman2:response-status caveman2:*response*) 403)
  (render-json "Hello"))

或者您可以在包定义中导入 caveman2:*response*caveman2:response-status ,并像其他 caveman2 一样使用它诸如 defrouterender-json 之类的符号:

(defroute "/books/" ()
  (setf (response-status *response*) 403)
  (render-json "Hello"))

关于common-lisp - 如何使用 Caveman2 设置响应状态代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73436058/

相关文章:

ruby - __FILE__ == $PROGRAM_NAME 在 ruby​​ 中是什么意思?

lisp - SBCL 中的 bignum 乘法

lisp - 读取时评估宏与准引用

package - 延迟加载时,lisp 包在读取时不可用

lisp - Common Lisp,从破坏性的列表中删除元素

perl - perl 中的动态变量

perl - perl特殊变量$-[0]和$ + [0]是什么意思

perl - Perl 中的美元插入符号零变量 ( $^0 ) 是什么?

list - 根据某些元素对列表进行排序