我有一个基于compojure的应用程序,在那里我需要解析一个请求并检索可以是数字的参数。我希望能够在实际处理请求之前验证参数是否存在以及它们是否为数字。这就是我到目前为止所知道的:
(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")))有没有更好的方法来进行字符串->数字转换?
有没有更好的方法来做请求验证?
发布于 2012-08-29 18:47:52
这个问题包含了parsing numbers in Clojure的很好的例子。如果您不确定字符串是否包含有效的数字,那么您的方法看起来很好。
如果可以将参数作为查询字符串的一部分进行传递,则可以使用具有正则表达式的路由来检索值,例如
(GET ["/user/:id", :id #"[0-9]+"] [id]
(let [num (read-string id)]
(str "The number is: " num)))只有在满足正则表达式条件时,路由才会匹配,因此您可以跳过Integer/parseInt检查。
发布于 2017-09-28 20:16:37
使用Long/parseLong而不是Integer/parseInteger。后者仅支持32位,这通常是不够的;例如,数据实体ID不适合Integer。
切勿使用read-string作为用户输入。此外,您必须清理用户输入,删除注入的脚本等。https://github.com/alxlit/autoclave是一个很好的开始,尽管可以说默认设置过于激进。
https://stackoverflow.com/questions/12175709
复制相似问题