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"))

我认为您所做的所有验证都是在验证字符串的内容是否全部为数字。它没有将其转换为整数。