如何在 Hunchentoot 中获取 POST 作为函数的参数?
How to get the POST as parameter of a function in Hunchentoot?
我想使用网络公式来过滤存储在 mongo-db 中的记录。
我的查询函数使用如下过滤器:
(defun models (filter)
(docs (db.find *model-collection*
filter
:limit 1)))
当我在 SBCL 中使用它时,它可以检索记录 {"NAME" :"a1"},使用以下命令之一:
(models ($ "NOM" "a1"))
(models (eval (read-from-string "(kv \"NOM\" \"a1\")")))
(<DOCUMENT> : {
_id : CL-MONGO::BSON-OID ...elements : 14})
现在我添加在Hunchentoot开发的网页界面,一个用于查询公式,一个用于显示响应:
(define-easy-handler (test :uri "/test") ()
(with-html-output-to-string (*standard-output* nil :prologue t :indent t)
(:html
(:body
(:h1 "Test")
(:form :action "/test1" :method "post" :id "addform"
(:input :type "text" :name "name" :class "txt")
(:input :type "submit" :class "btn" :value "Submit"))))))
(define-easy-handler (test1 :uri "/test1") (name)
(with-html-output-to-string (*standard-output* nil :prologue t :indent t)
(:html
(:body
(:h1 "My List")
(:p (str (models name)))))))
当我在提交表单中输入以下过滤器时:($ "NAME" "a1"),
我在显示页面出现错误,在 SBCL 中出现以下日志:
compiling (DEFINE-EASY-HANDLER (TEST1 :URI ...) ...)
[2015-02-12 15:41:47 [ERROR]] The value #\( is not of type (UNSIGNED-BYTE 8).
17: ((SB-PCL::FAST-METHOD CL-MONGO:DB.FIND (STRING T))
#<unused argument>
#<unused argument>
"mycollection"
"($ \"NOM\" \"a1\")"
:MONGO
NIL
:OPTIONS
0
:SKIP
0
:LIMIT
1
:SELECTOR
NIL)
18: (WEB-TEST::MODELS2 "($ \"NOM\" \"a1\")")
19: (WEB-TEST::TEST1 :NAME NIL)
它在 test1 中尝试了几个预转换,例如:
(:p (str (models (eval (read-from-string name)))))
or (:p (str (models (eval (esc name)))))
但是其中 none 个可以正常工作。有没有人可以建议?
您正在将字符串传递给 models
,而不是 $
生成的过滤器。在外部输入上使用 eval
也是一个 非常糟糕的主意 。
您可以将名称传递给您的处理程序并从中构建过滤器:
(:p (str (models ($ "NOM" name))))
使用 a1
作为 name
调用您的处理程序。
我通常不建议让用户传入未经检查就命中数据库的任意表达式。
我想使用网络公式来过滤存储在 mongo-db 中的记录。
我的查询函数使用如下过滤器:
(defun models (filter)
(docs (db.find *model-collection*
filter
:limit 1)))
当我在 SBCL 中使用它时,它可以检索记录 {"NAME" :"a1"},使用以下命令之一:
(models ($ "NOM" "a1"))
(models (eval (read-from-string "(kv \"NOM\" \"a1\")")))
(<DOCUMENT> : {
_id : CL-MONGO::BSON-OID ...elements : 14})
现在我添加在Hunchentoot开发的网页界面,一个用于查询公式,一个用于显示响应:
(define-easy-handler (test :uri "/test") ()
(with-html-output-to-string (*standard-output* nil :prologue t :indent t)
(:html
(:body
(:h1 "Test")
(:form :action "/test1" :method "post" :id "addform"
(:input :type "text" :name "name" :class "txt")
(:input :type "submit" :class "btn" :value "Submit"))))))
(define-easy-handler (test1 :uri "/test1") (name)
(with-html-output-to-string (*standard-output* nil :prologue t :indent t)
(:html
(:body
(:h1 "My List")
(:p (str (models name)))))))
当我在提交表单中输入以下过滤器时:($ "NAME" "a1"), 我在显示页面出现错误,在 SBCL 中出现以下日志:
compiling (DEFINE-EASY-HANDLER (TEST1 :URI ...) ...)
[2015-02-12 15:41:47 [ERROR]] The value #\( is not of type (UNSIGNED-BYTE 8).
17: ((SB-PCL::FAST-METHOD CL-MONGO:DB.FIND (STRING T))
#<unused argument>
#<unused argument>
"mycollection"
"($ \"NOM\" \"a1\")"
:MONGO
NIL
:OPTIONS
0
:SKIP
0
:LIMIT
1
:SELECTOR
NIL)
18: (WEB-TEST::MODELS2 "($ \"NOM\" \"a1\")")
19: (WEB-TEST::TEST1 :NAME NIL)
它在 test1 中尝试了几个预转换,例如:
(:p (str (models (eval (read-from-string name)))))
or (:p (str (models (eval (esc name)))))
但是其中 none 个可以正常工作。有没有人可以建议?
您正在将字符串传递给 models
,而不是 $
生成的过滤器。在外部输入上使用 eval
也是一个 非常糟糕的主意 。
您可以将名称传递给您的处理程序并从中构建过滤器:
(:p (str (models ($ "NOM" name))))
使用 a1
作为 name
调用您的处理程序。
我通常不建议让用户传入未经检查就命中数据库的任意表达式。