我有基于compojure的app,我需要解析一个请求并检索可以是数字的参数。我希望能够在实际处理请求之前验证参数是否存在以及它们是否为数字。这就是我到目前为止所做的:
(defn get-int [str]
"Returns nil if str is not a number"
(try (Integer/parseInt str)
(catch NumberFormatException _)))
(defn some-request [request]
(let [some-number (get-int (get-in request [:route-params :some-number])
other-number (get-int (get-in request [:route-params :other-number])]
(if (every? identity [some-number other-number])
(process-the-request)
(bad-request "The request was malformed")))
有更好的方法来做字符串 - >号码转换?
有更好的方法来进行请求验证吗?
答案 0 :(得分:7)
这个问题包含parsing numbers in Clojure的好例子。如果您不确定该字符串是否包含有效数字,那么您的方法看起来不错。
如果您可以将参数作为查询字符串的一部分传递,则可以使用带有正则表达式的路径来检索值,例如
(GET ["/user/:id", :id #"[0-9]+"] [id]
(let [num (read-string id)]
(str "The number is: " num)))
只有满足正则表达式条件才会匹配路由,因此您可以跳过Integer / parseInt检查。
答案 1 :(得分:0)
使用Long/parseLong
代替Integer/parseInteger
。后者只支持32位,这通常是不够的;例如,Datomic实体ID不适合Integer。
切勿将read-string
用于用户输入。此外,您必须清理用户输入,删除注入的脚本等。 https://github.com/alxlit/autoclave是一个好的开始,虽然默认值可能过于激进。