7

我有基于 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")))

有没有更好的方法来进行字符串 -> 数字转换?

有没有更好的方法来进行请求验证?

4

2 回答 2

7

这个问题包含在 Clojure 中解析数字的好例子。如果您不确定字符串是否包含有效数字,那么您的方法看起来不错。

如果您可以将参数作为查询字符串的一部分传递,则可以使用带有正则表达式的路由来检索值,例如

(GET ["/user/:id", :id #"[0-9]+"] [id] 
  (let [num (read-string id)]
    (str "The number is: " num)))

仅当满足正则表达式条件时,路由才会匹配,因此您可以跳过 Integer/parseInt 检查。

于 2012-08-29T10:47:51.800 回答
0

使用Long/parseLong而不是Integer/parseInteger. 后者仅支持 32 位,这往往是不够的;例如,Datomic 实体 ID 不适合 Integer。

切勿read-string用于用户输入。此外,您必须清理用户输入,删除注入的脚本等。https://github.com/alxlit/autoclave是一个好的开始,尽管默认设置可能过于激进。

于 2017-09-28T12:16:37.147 回答