首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用caveman2设置响应状态代码?

如何使用caveman2设置响应状态代码?
EN

Stack Overflow用户
提问于 2022-08-21 16:01:24
回答 2查看 71关注 0票数 2

我正在尝试创建一个端点,它将使用caveman2发送状态代码。

代码语言:javascript
复制
(defroute "/books/" ()
  (render-json "Hello"))

我找到了函数throw-code,它允许我发送状态代码,但它也不允许我发送响应体。好像是用来处理错误的。

代码语言:javascript
复制
(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子类的实例。

代码语言:javascript
复制
(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)

但是,我不知道如何实例化这些对象或如何导入它们。我找不到一个有用的例子,当我把它放进我的代码中时,它不会编译。

我怎样才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-22 14:32:55

在处理请求时,*response*变量绑定到实例(它是一个特殊变量)。您可以使用以下简短的示例进行实验:

你需要这些系统:

代码语言:javascript
复制
(ql:quickload '(:clack :caveman2))

然后:

代码语言:javascript
复制
(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页面。

现在,让我们创建一个具有不同状态的主体的页面:

代码语言:javascript
复制
(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,但是页面也显示了一个主体。

票数 0
EN

Stack Overflow用户

发布于 2022-08-22 05:41:15

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

代码语言:javascript
复制
(defroute "/books/" ()
  (setf (caveman2:response-status caveman2:*response*) 403)
  (render-json "Hello"))

或者,您可以在包定义中导入caveman2:*response*caveman2:response-status,并类似于其他caveman2符号(如defrouterender-json )使用它们。

代码语言:javascript
复制
(defroute "/books/" ()
  (setf (response-status *response*) 403)
  (render-json "Hello"))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73436058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档