Common Lisp POST数据处理问题:clientName与dbName值为nil
我定义了如下POST路由:
(defroute admin-post ("/admin" :method :post) (&post clientName dbName email) (let ((c (write-to-string clientName)) (d (write-to-string dbName)) (res (by-email email))) (render-template* *admin.html* nil :title "Admin Area" :clientName c :dbName d :db-res res)))
其中email的值能被by-email函数正常处理,但c和d的值始终为nil。即使去掉write-to-string,页面上对应的字段还是空值。
补充的HTML表单代码如下(表单名称与路由参数一致):
<form id="form" action="/admin" method="post"> <input type="text" name="clientName" placeholder="Enter Client Name"/> <input type="text" name="dbName" placeholder="Enter DB name"/> <input type="submit" value="Send"/> </form>
可能的解决方法
核对参数命名的大小写与格式:不少Lisp Web框架对POST参数名的大小写或格式敏感,虽然表单和路由里用了
clientName驼峰命名,但部分框架会自动将参数名转为全小写(比如clientname)或者下划线分隔格式(client_name)。可以尝试把路由参数改成全小写,同时调整表单的name属性匹配,比如:
路由改为(&post clientname dbname email),表单里name="clientname"、name="dbname";或者改用下划线分隔的命名,路由用client-name,表单对应name="client-name"。确认表单的Content-Type:表单默认的
Content-Type是application/x-www-form-urlencoded,但如果有其他配置影响了这个类型,可能导致参数解析失败。可以显式在表单标签里添加:<form id="form" action="/admin" method="post" enctype="application/x-www-form-urlencoded">调试查看实际接收的参数:在路由里添加调试代码,打印所有接收到的POST参数,确认实际传递的键名是什么:
(defroute admin-post ("/admin" :method :post) (&post &all-params) (format t "POST参数列表: ~a" all-params) ;; 原有逻辑代码 )运行后查看控制台输出,就能知道框架实际接收到的参数键名,再对应调整路由里的参数名称。
检查中间件配置:如果你的Web应用使用了参数解析类的中间件,要确认中间件没有对参数名做额外转换或过滤,导致
clientName和dbName被意外丢弃。
内容的提问来源于stack exchange,提问作者Vinn

