Skip to content
YANG YUE edited this page Aug 9, 2016 · 1 revision

URL编码参数是浏览器传递值到web应用的主要方式.当一个用户提交一个表单,它们就会被发送,而且通常被使用在一些其他事情上,像分页.

因为Ring是一个底层接口,它不支持参数除非你应用一个正确的中间件:

(use 'ring.middleware.params)
(def app
  (wrap-params your-handler))

wrap-params中间件提供了URL编码参数的支持在查询字符串中,或者在来自HTTP请求body中.

它不支持文件上传,这通过wrap-multipart-params中间件被处理.查看文件上传章节获取更多关于multipart forms的信息.

wrap-params函数接收一个选项的可选的map.目前只有一个公认的key:

  • :encoding - 参数的字符编码.默认情况下是请求字符编码,或者是UTF-8如果没有请求字符编码被设置的话.

当应用到一个处理器的时候,参数中间件添加三个新的key到请求map:

  • :query-params - 来自查询字符串的一个参数map
  • :form-params - 来自提交的表单数据的一个参数map
  • :params - 一个所有参数合并后的map

例如,如果你有一个像这样的请求:

{:http-method :get
 :uri "/search"
 :query-string "q=clojure"}

然后wrap-params中间件将会修改请求信息:

{:http-method :get
 :uri "/search"
 :query-string "q=clojure"
 :query-params {"q" "clojure"}
 :form-params {}
 :params {"q" "clojure"}}

通常你将只会想要使用:params key,但是其它的keys被用来以防你需要区分一个参数是通过查询字符串传递的,另一个是通过POSTed HTML表单传递的.

参数keys是字符串,而且值(values)也同样是字符串,如果这里只有一个值关联参数名,或者vectors,如果有多个具有相同名称的名称/值(name/value)对。

例如,如果你又这样一个URL:

http://example.com/demo?x=hello

然后你的参数map就像这样:

{"x" "hello"}

但是如果你有着相同名字多个参数:

http://example.com/demo?x=hello&x=world

然后你的参数map就像这样:

{"x" ["hello", "world"]}