Clojure Compojure api:通过多部分参数提供的映射的请求强制

Clojure Compojure api:通过多部分参数提供的映射的请求强制,clojure,compojure,compojure-api,Clojure,Compojure,Compojure Api,我正在尝试将compojure api(版本1.1.12)集成到现有的基于compojure的应用程序中。虽然大多数事情都是可行的,但我对现有REST调用的请求强制有一个问题,此时很难更改该调用的用法 这是一个帖子 它需要通过多部分/表单数据提供参数 大多数参数是可选的 大多数参数都很简单:字符串或字符串数组 一个可选参数应该是JSON编码的映射 我这样定义路线: (POST "/endpoint" request :multipart-params [requir

我正在尝试将compojure api(版本1.1.12)集成到现有的基于compojure的应用程序中。虽然大多数事情都是可行的,但我对现有REST调用的请求强制有一个问题,此时很难更改该调用的用法

  • 这是一个帖子
  • 它需要通过多部分/表单数据提供参数
  • 大多数参数是可选的
  • 大多数参数都很简单:字符串或字符串数组
  • 一个可选参数应该是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} {}}]
    ...)
这是可行的,除非我尝试在请求中传递
其他参数。例如,通过卷曲:

curl -F "required-strings=[\"Hello\"]" -F "others={\"a\":1.0}" ...
这将导致无效请求(即状态400)错误,内容如下:

{"errors":{"others":"(not (map? a-clojure.lang.PersistentVector))"}}
我使用的是ringdefault的
站点默认值
,我还没有修改compoure api的默认强制。我已将错误跟踪到
compojure.api.concure/concure
。我可以看到强制器正在处理的值,它看起来像:

{:required-strings "[\"Hello\"]"
 :others "{\"a\":1.0}"}
在强制.clj的第59行,
(强制值)
返回一个错误(根据
schema.utils/error?


那么,是否不可能将JSON编码的多部分参数强制转换为Clojure映射?我可以将参数定义为字符串而不是映射,并自己进行解析,但这违背了使用compojure api和ring-swagger的目的。

其他人的强制程序需要clojure映射而不是字符串。要想让它发挥作用,你必须选择

第一个选项:添加中间件并执行
应用程序/json
请求,而不是
多部分/表单数据

curl ... -H 'Content-Type: application/json' \
     -d $'{
  "required-strings": ["Hello"],
  "others": {"a": 1.0}
}'
第二个选项:使用嵌套参数名称添加中间件和
多部分/表单数据
请求:

curl ... -H 'Content-Type: multipart/form-data' \
     -F "required-strings[]=Hello" \
     -F "others[a]=1.0"