Common lisp 如何在Hunchentoot或Clack中启用CORS,或如何添加特定标题?

Common lisp 如何在Hunchentoot或Clack中启用CORS,或如何添加特定标题?,common-lisp,hunchentoot,Common Lisp,Hunchentoot,问题说明了一切。本教程:至少要在服务器的响应中添加一个访问控制允许源代码:标题 我的应用程序running Hunchentoot不会返回: <!-- GET http://127.0.0.1:9000/ --> <!-- HTTP/1.1 200 OK --> <!-- Date: Fri, 13 Oct 2017 23:26:58 GMT --> <!-- Server: Hunchentoot 1.2.37 --> <!-- Keep-

问题说明了一切。本教程:至少要在服务器的响应中添加一个
访问控制允许源代码:
标题

我的应用程序running Hunchentoot不会返回:

<!-- GET http://127.0.0.1:9000/ -->
<!-- HTTP/1.1 200 OK -->
<!-- Date: Fri, 13 Oct 2017 23:26:58 GMT -->
<!-- Server: Hunchentoot 1.2.37 -->
<!-- Keep-Alive: timeout=20 -->
<!-- Connection: Keep-Alive -->
<!-- Transfer-Encoding: chunked -->
<!-- Content-Type: text/html;charset=utf-8 -->
<!-- Request duration: 0.004275s -->
添加

(defun change-headers (headers)
  (setf (lack.response:response-headers *response*) headers))
C-C-C=>

包缺少。响应不存在

或使用Hunchentoot:

(setf (hunchentoot:header-out "Access-Control-Allow-Origin") "*")
变量Hunchentoot:*reply*未绑定

实际上,这个变量是用
def unbound
定义的


编辑2:尝试与宁格尔

(in-package :cl-user)
(defpackage todobackend-ningle
  (:use :cl))
(in-package :todobackend-ningle)

;; blah blah blah.

(defvar *response* nil "") ;; to try the snippet below

(defun change-headers (headers)
  ;; (setf (lack.response:response-headers *response*) headers)) ;; => the value nil is not of type lack.response:response
  (setf (lack.response:response-headers lack.response:response) headers)) ;; => unbound

(defvar *app* (make-instance 'ningle:<app>))

(change-headers '(:access-control-allow-origin "*"))

(setf (ningle:route *app* "/")
      (lambda (params) ;; is that right ?
           (change-headers '(:access-control-allow-origin "*"))
           "Welcome to ningle!"))
(包中:cl用户)
(为杜巴肯德·宁格尔设计)
(:用法:cl))
(包装内:todobackend ningle)
;; 废话废话。
(defvar*响应*nil“”);;尝试下面的代码片段
(取消更改标题(标题)
;;(setf(缺少.响应:响应头*响应*)头));=>值nil不是缺少的类型。响应:响应
(setf(缺少.响应:响应头缺少.响应:响应)头));=>解开
(defvar*应用程序*(生成实例“ningle:))
(更改标题“(:访问控制允许原点“*”))
(setf(宁乐:路线*应用*“/”)
是这样吗?
(更改标题“(:访问控制允许原点“*”))
“欢迎来到宁乐!”)

以下是我用于Clack with Ningle的代码,希望它能帮助您:

(defpackage ...
  (:use :cl :ningle))
(in-package ...)

(defun change-headers (headers)
  (setf (lack.response:response-headers *response*) headers))

(defmacro api-route (url method en-tetes &body corps)
  `(setf (ningle:route *app* ,url :method ,method)
     ;; that's why your code doesn't work, you actually have to pass a #'function
     #'(lambda (params)
         (change-headers ,headers)
         ,@corps)))
注意:
*响应*
来自,根据文件中的注释,我可能用错了

此宏可用于创建管线和指定标头,如下所示:

(api-route
   "/"
   :get
   '(:access-control-allow-origin "*")
   "Welcome!")
记住,对于
GET
请求,这就足够了,但是对于其他动词,浏览器将首先点击
选项
。您必须至少使用以下标题来回答:

  '(:access-control-allow-methods "POST"          ; or any other verb(s)
    :access-control-allow-origin "*"
    :access-control-allow-headers "content-type")

这个代码来自我的一个小玩具项目。如果你愿意,你可以看看,希望它能给你一些想法。这没什么了不起的,可能有更好的方法,但是,嘿,它是有效的。

根据文档,
HEADER-OUT的
SETF
应该可以用于添加新的头。谢谢。现在必须再试一点(setf(hunchentoot:header out“Access Control Allow Origin”)“*”
抛出我“变量hunchentoot:*REPLY*未绑定”。因为它确实是用
defvar unbound
声明的,必须在请求上下文中使用。但我实际上在使用Clack,不妨看看那边。你是直接使用Clack,还是借助于框架(如Ningle)?确实是Lucerne。乍一看,
包缺乏。响应
不存在。我将更新我的问题以显示我的项目框架。使用
(lack.
我已经完成了
lack.util/builder/component/middleware
,但没有
响应
!哇哇哇哇哇哇哇哇,我没有看到,在lack和clack中搜索,但在ningle中没有发现(ningle示例直接调用
ningle:…
,现在它工作了,并且添加了我的标题。非常感谢!
  '(:access-control-allow-methods "POST"          ; or any other verb(s)
    :access-control-allow-origin "*"
    :access-control-allow-headers "content-type")