Clojure、Compojure:路径参数总是在 Compojure 中作为字符串传递 API
Clojure, Compojure: Path Parameter always getting passed as String in Compojure API
我正在传递路径参数以从数据库中获取数据。
终点
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 正在作为字符串值传递给查询。
在传递给 Query 之前将 Path 参数类型更改为 Number 的最佳方法是什么?
使用 Compojure 1.4.0 及更高版本,您可以使用语法
强制参数
[id :<< as-int]
另一种选择是使用 Java 互操作将 id 转换为整数:
(Integer/parseInt id)
由于您使用的是 compojure-api, you can also coerce input and output data 架构或规范。
我找到了一种解决问题的方法,但不确定我的做法是否正确?
(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))})))
您似乎在使用 compojure-api (https://github.com/metosin/compojure-api), which support both Schema and clojure.spec based coercion. Here is an example of path-parameter coercion with 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/
希望这对您有所帮助。
托米
我们利用架构的东西来做到这一点。
(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"))
我认为您所做的所有验证都是在验证字符串的内容是否全部为数字。它没有将其转换为整数。
我正在传递路径参数以从数据库中获取数据。
终点
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 正在作为字符串值传递给查询。
在传递给 Query 之前将 Path 参数类型更改为 Number 的最佳方法是什么?
使用 Compojure 1.4.0 及更高版本,您可以使用语法
强制参数[id :<< as-int]
另一种选择是使用 Java 互操作将 id 转换为整数:
(Integer/parseInt id)
由于您使用的是 compojure-api, you can also coerce input and output data 架构或规范。
我找到了一种解决问题的方法,但不确定我的做法是否正确?
(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))})))
您似乎在使用 compojure-api (https://github.com/metosin/compojure-api), which support both Schema and clojure.spec based coercion. Here is an example of path-parameter coercion with 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/
希望这对您有所帮助。
托米
我们利用架构的东西来做到这一点。
(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"))
我认为您所做的所有验证都是在验证字符串的内容是否全部为数字。它没有将其转换为整数。