我正在尝试将compojure(版本1.1.12)集成到一个现有的基于compojure的应用程序中。虽然大多数事情都是有效的,但在现有REST调用上,请求强制强制(Request胁迫)存在问题,此时该调用的使用将很难更改。
我定义的路线如下:
(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))"}}我使用的是循环默认的site-defaults,而且我还没有为compojure修改默认的矫顽器。我把错误追溯到compojure.api.coerce/coerce。我可以看到胁迫者正在处理的值,它看起来是:
{:required-strings "[\"Hello\"]"
:others "{\"a\":1.0}"}在coerce.clj的第59行,(coerce value)返回一个错误(每个schema.utils/error?)。
那么,难道不可能将JSON编码的多部分参数强制转换到Clojure映射中吗?我可以将参数定义为字符串而不是映射,并自己进行解析,但这违背了使用compojure和ring-swagger的目的。
发布于 2018-07-24 05:34:42
others的承担者期望的是clojure映射,而不是字符串。要让它发挥作用,你必须有选择。
第一个选项:添加包-json-params中间件并执行application/json请求而不是multipart/form-data
curl ... -H 'Content-Type: application/json' \
-d $'{
"required-strings": ["Hello"],
"others": {"a": 1.0}
}'第二个选项:使用嵌套的param名称添加套式-嵌套-旁式中间件和multipart/form-data请求:
curl ... -H 'Content-Type: multipart/form-data' \
-F "required-strings[]=Hello" \
-F "others[a]=1.0" https://stackoverflow.com/questions/51105354
复制相似问题