首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure中验证compojure请求时从字符串解析整数

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

Stack Overflow用户
提问于 2012-08-29 18:18:44
回答 2查看 2K关注 0票数 7

我有一个基于compojure的应用程序,在那里我需要解析一个请求并检索可以是数字的参数。我希望能够在实际处理请求之前验证参数是否存在以及它们是否为数字。这就是我到目前为止所知道的:

代码语言:javascript
复制
(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")))

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-29 18:47:52

这个问题包含了parsing numbers in Clojure的很好的例子。如果您不确定字符串是否包含有效的数字,那么您的方法看起来很好。

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

代码语言:javascript
复制
(GET ["/user/:id", :id #"[0-9]+"] [id] 
  (let [num (read-string id)]
    (str "The number is: " num)))

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

票数 7
EN

Stack Overflow用户

发布于 2017-09-28 20:16:37

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12175709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档