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

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

    1. (use 'ring.middleware.params)
    2. (def app
    3. (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
      例如,如果你有一个像这样的请求:
    1. {:http-method :get
    2. :uri "/search"
    3. :query-string "q=clojure"}

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

    1. {:http-method :get
    2. :uri "/search"
    3. :query-string "q=clojure"
    4. :query-params {"q" "clojure"}
    5. :form-params {}
    6. :params {"q" "clojure"}}

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

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

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

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

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

    1. {"x" "hello"}

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

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

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

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