Compojure 绑定来自 URL 的 HTTP 请求参数,而不是来自 POST 表单

Posted

技术标签:

【中文标题】Compojure 绑定来自 URL 的 HTTP 请求参数,而不是来自 POST 表单【英文标题】:Compojure binds HTTP request params from URL, but not from a POST form 【发布时间】:2011-04-21 05:22:16 【问题描述】:

Compojure 不绑定 POST 表单中的字段。这是我的路线定义:

(defroutes main-routes
  (POST "/query" params :params
    (debug (str "|" params "|"))
    "OK...")
)

当我发布一个包含字段的表单时,我得到 ||,即没有参数。顺便说一句,当我去http://localhost/query?param1=value1 时,params 不是空的,并且值会打印在服务器控制台上。

表单字段还有其他绑定吗?

【问题讨论】:

【参考方案1】:

注意: (params "id") 为我返回 nil,我用 (params :id) 得到一个正确的值

【讨论】:

【参考方案2】:

这是如何处理参数的一个很好的例子

(ns example2
  (:use [ring.adapter.jetty             :only [run-jetty]]
    [compojure.core                 :only [defroutes GET POST]]
    [ring.middleware.params         :only [wrap-params]]))

(defroutes routes
  (POST "/" [name] (str "Thanks " name))
  (GET  "/" [] "<form method='post' action='/'> What's your name? <input type='text' name='name' /><input type='submit' /></form>"))

(def app (wrap-params routes))

(run-jetty app :port 8080)

https://github.com/heow/compojure-cookies-example

参见示例 2 - 中间件是功能

【讨论】:

【参考方案3】:

确保您的输入字段具有 name="zzz" 属性,但不仅仅是 id="zzz"。

html 表单收集所有输入并使用 name 属性发布它们

my_post.html

<form action="my_post_route" method="post">
    <label for="id">id</label> <input type="text" name="id" id="id" />
    <label for="aaaa">aaa</label> <input type="text" name="aaa" id="aaa" />
    <button type="submit">send</button>
</form>

my_routes.clj

(defroutes default-handler
  ;,,,,
  (POST "/my_post_route" params :params 
    (str "POST id=" (params "id") " params=" params))
  ;,,,,

产生类似的响应

id=21 params="aaa" "aoeu", "id" "21"

【讨论】:

以上是关于Compojure 绑定来自 URL 的 HTTP 请求参数,而不是来自 POST 表单的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Clojure/Compojure/Ring 中将映射转换为 URL 查询字符串?

访问 Compojure 查询字符串

如何绑定动态变量?

如何找到运行 Compojure 的网络托管服务

Compojure 还是 Noir 用于无 UI 的 Web 服务?

ring-json的wrap-json-response中间件和compojure返回text / plain?