在Clojure中验证compojure请求时,从字符串中解析整数

Odi*_*din 7 clojure compojure

我有基于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")))
Run Code Online (Sandbox Code Playgroud)

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

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

raj*_*ter 7

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

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

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

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

  • 如果你在用户输入上使用`read-string`,可能想要将`*read-eval*`绑定为false. (4认同)
  • 现在有内置的强制支持,`[id:<< as-int]`,请参阅https://github.com/weavejester/compojure/wiki/Destructuring-Syntax (3认同)