首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Compojure-api:通过多部分params提供的映射的请求强制

Compojure-api:通过多部分params提供的映射的请求强制
EN

Stack Overflow用户
提问于 2018-06-29 15:45:51
回答 1查看 395关注 0票数 0

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

  • 这是个职位
  • 它通过多部分/表单数据来期望参数。
  • 大多数参数都是可选的。
  • 大多数参数都很简单:字符串或字符串数组。
  • 一个可选参数应该是一个JSON编码的映射。

我定义的路线如下:

代码语言:javascript
复制
(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:

代码语言:javascript
复制
curl -F "required-strings=[\"Hello\"]" -F "others={\"a\":1.0}" ...

这将导致无效请求(即状态400)错误,内容如下:

代码语言:javascript
复制
{"errors":{"others":"(not (map? a-clojure.lang.PersistentVector))"}}

我使用的是循环默认的site-defaults,而且我还没有为compojure修改默认的矫顽器。我把错误追溯到compojure.api.coerce/coerce。我可以看到胁迫者正在处理的值,它看起来是:

代码语言:javascript
复制
{:required-strings "[\"Hello\"]"
 :others "{\"a\":1.0}"}

在coerce.clj的第59行,(coerce value)返回一个错误(每个schema.utils/error?)。

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

EN

回答 1

Stack Overflow用户

发布于 2018-07-24 05:34:42

others的承担者期望的是clojure映射,而不是字符串。要让它发挥作用,你必须有选择。

第一个选项:添加包-json-params中间件并执行application/json请求而不是multipart/form-data

代码语言:javascript
复制
curl ... -H 'Content-Type: application/json' \
     -d $'{
  "required-strings": ["Hello"],
  "others": {"a": 1.0}
}'

第二个选项:使用嵌套的param名称添加套式-嵌套-旁式中间件和multipart/form-data请求:

代码语言:javascript
复制
curl ... -H 'Content-Type: multipart/form-data' \
     -F "required-strings[]=Hello" \
     -F "others[a]=1.0" 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51105354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档