我正在尝试将 compojure-api(版本 1.1.12)集成到现有的基于 compojure 的应用程序中。虽然大多数事情都有效,但我在现有 REST 调用上的请求强制存在问题,此时其用法很难更改。
- 这是一个帖子
- 它期望通过 multipart/form-data 参数
- 大多数参数是可选的。
- 大多数参数都很简单:字符串或字符串数组。
- 一个可选参数应为 JSON 编码的地图。
我这样定义路线:
(POST "/endpoint" request
:multipart-params
[required-strings :- (describe [s/Str] "Required, an array of strings"),
{optional-string :- (describe s/Str "An optional string") ""},
{others :- {s/Keyword s/Any} {}}]
...)
这有效,除非我尝试传递other-parameters
请求。例如,通过 curl:
curl -F "required-strings=[\"Hello\"]" -F "others={\"a\":1.0}" ...
这会导致内容无效请求(即状态 400)错误:
{"errors":{"others":"(not (map? a-clojure.lang.PersistentVector))"}}
我正在使用 ring-default's site-defaults
,并且我没有修改 compojure api 的默认强制。我已将错误追踪到compojure.api.coerce/coerce
. 我可以看到强制器正在处理的值,它看起来像:
{:required-strings "[\"Hello\"]"
:others "{\"a\":1.0}"}
在 coerce.clj 的第 59 行,(coerce value)
返回一个错误 (per schema.utils/error?
)。
那么,是否不可能将 JSON 编码的多部分参数强制转换为 Clojure 映射?我可以将参数定义为字符串而不是映射,并自己进行解析,但这违背了使用 compojure-api 和 ring-swagger 的目的。