Clojure,Compojure:Path参数总是在Compojure API中作为String传递

时间:2017-07-25 13:41:03

标签: clojure compojure 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被作为String值传递给查询。

在传递给Query之前,将Path参数类型更改为Number的最佳方法是什么?

4 个答案:

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

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