Clojure Compojure api:通过多部分参数提供的映射的请求强制
我正在尝试将compojure api(版本1.1.12)集成到现有的基于compojure的应用程序中。虽然大多数事情都是可行的,但我对现有REST调用的请求强制有一个问题,此时很难更改该调用的用法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
- 这是一个帖子
- 它需要通过多部分/表单数据提供参数
- 大多数参数是可选的
- 大多数参数都很简单:字符串或字符串数组
- 一个可选参数应该是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"