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")