You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Caveman2中设置响应状态码并返回响应体?

解决Caveman2端点同时返回状态码和响应体的问题

要在Caveman2中创建既能返回指定HTTP状态码又能携带响应体的端点,你可以通过修改内置的*response*特殊变量来实现,无需额外实例化对象。以下是具体步骤和示例:

核心原理

Caveman2在请求处理流程中会自动创建*response*(响应对象)和*request*(请求对象)这两个特殊变量,它们在路由函数内部直接可用,不需要手动导入或实例化——只要你正确引入了Caveman2包。

正确实现方式

1. 确保引入Caveman2包

在代码开头添加:

(use-package :caveman2)

或者使用带包限定的符号(比如caveman2:*response*),避免符号冲突。

2. 编写带状态码和响应体的路由

在路由函数中,先设置响应的状态码,再返回你的响应体内容。示例如下:

(defroute "/books/" ()
  ;; 设置HTTP状态码为403
  (setf (status *response*) 403)
  ;; 返回JSON响应体
  (render-json "Hello"))

为什么throw-code不适用

throw-code的设计目的是中断请求处理并返回错误状态码,它会抛出一个异常,导致后续代码(比如render-json)根本不会执行,因此无法同时返回响应体。只有在不需要返回自定义响应体的错误场景下,才适合使用throw-code。

补充说明

如果需要自定义响应头(比如Content-Type),也可以通过*response*的response-headers属性修改:

(setf (getf (response-headers *response*) :content-type) "application/json")

内容的提问来源于stack exchange,提问作者zimio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:06:26