我正在传递路径参数以从数据库中获取数据。
终点
http://localhost:3000/hello/1000
获取方法代码
代码
(ns clojure-dauble-business-api.core
(:require [compojure.api.sweet :refer :all]
[ring.util.http-response :refer :all]
[clojure-dauble-business-api.logic :as logic]
[clojure.tools.logging :as log]
[clojure-dauble-business-api.domain.artwork])
(:import [clojure_dauble_business_api.domain.artwork Artwork]))
(defapi app
(GET ["/hello/:id", :id #"[0-9]+"] [id]
(log/info "Function begins from here" id)
(ok {:artwork (logic/artwork-id id)})))
当我从Postman点击终点时,我收到此错误,
org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = character varying
我已经知道值id被作为String值传递给查询。
在传递给Query之前,将Path参数类型更改为Number的最佳方法是什么?
答案 0 :(得分:5)
使用Compojure 1.4.0及更高版本,您可以使用语法
强制参数[id :<< as-int]
另一种选择是使用Java互操作将id转换为Integer:
(Integer/parseInt id)
由于您使用的是compojure-api,因此您还可以coerce input and output data使用架构或规范。
答案 1 :(得分:1)
我找到了一种解决问题的方法,但不确定我是否以正确的方式做事?
(defapi app
(GET ["/hello/:id", :id #"[0-9]+"] [id]
(log/info "Function begins from here" id)
(ok {:artwork (logic/artwork-id (->> id (re-find #"\d+") Long/parseLong))})))
答案 2 :(得分:1)
您似乎正在使用compojure-api(https://github.com/metosin/compojure-api),它支持基于Schema和clojure.spec的强制。以下是使用Schema进行路径参数强制的示例:https://github.com/metosin/compojure-api/blob/master/examples/thingie/src/examples/pizza.clj#L62-L66
有关胁迫的更多细节:http://www.metosin.fi/blog/clojure-spec-with-ring-and-swagger/
希望这会有所帮助。
托米
答案 3 :(得分:0)
我们利用Schema的功能来实现这一目标。
(context "" []
:middleware [v2-exception-handler]
:header-params [x-user-id :- X-User-Id]
其中X-User-Id
架构定义在其他地方,如...
(s/defschema X-User-Id
(rss/describe Long "ID of the user to operate on"))
我认为您所做的所有验证都是验证字符串的内容是否为全部数字。它没有将它转换为整数。