forked from ring-clojure/ring
-
Notifications
You must be signed in to change notification settings - Fork 1
参数(Parameters)
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"]}