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"]}
当前内容版权归 clojure-china 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 clojure-china .