Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

inconsistency in resource vs. macro based route definition behaviour

未关闭
#321 0 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
clojure
领域
api, backend

调研方向

重现 POST /foo curl 请求,然后将基于宏的路由与 context/resource 定义进行比较。从 resource 路由的 body 参数验证和自定义 text/plain middleware 开始;完成的标准是两种路由形式都能一致地处理同一个请求,且不会出现 nil String 验证错误。

由索引模型根据 Issue 内容生成。

描述

When making:

curl -X POST \
  'http://localhost:7777/foo?rule_name=foo.logic&force_overwrite=true&version=1.1' \
  -H 'accept: application/json' \
  -H 'cache-control: no-cache' \
  -H 'content-type: text/plain' \
  -d 'bla'

the following definition behaves correctly:

(POST "/foo" []
        :middleware [[muuntaja.middleware/wrap-format
                      (muuntaja/create
                        (assoc-in muuntaja/default-options
                                  [:formats "text/plain"] text-plain-format))]]
        :query-params [version :- String, rule_name :- String, force_overwrite :- String]
        :body [b s/Str]
        :return s/Any           
        (ok
          {:ok b})

on other hand this one is failing

(context "/foo" []
        (resource {
                   :post {
                          :middleware [[muuntaja.middleware/wrap-format
                                        (muuntaja/create
                                          (assoc-in muuntaja/default-options
                                                    [:formats "text/plain"] text-plain-format))]]

                          :parameters {:body-params  String
                                       :query-params {:version         s/Str
                                                      :rule_name       s/Str
                                                      :force_overwrite s/Str}}
                          :consumes   ["text/plain"]
                          :responses  {http-status/ok {:schema s/Any}}
                          :handler    (fn [{body :body-params {:keys [version rule_name]} :path-params}]
                                        (ok
                                          {:foo body}
                                          ))}}))

the error is:

{
    "schema": "java.lang.String",
    "errors": "(not (instance? java.lang.String nil))",
    "type": "compojure.api.exception/request-validation",
    "coercion": "schema",
    "value": null,
    "in": [
        "request",
        "body-params"
    ]
}

I use this auxiliary fun:


(def text-plain-format
  {:decoder [(fn make-json-decoder [options]
               (fn [x ^String charset]
                 (if (string? x)
                   x
                   (slurp (InputStreamReader. ^InputStream x charset)))))]

   :encoder [(fn make-json-encoder [options]
               (fn [data ^String charset]
                 (ByteArrayInputStream. (.getBytes data charset))))]})
主要语言
Clojure
星标
1.1k
派生
144
PR 合并指标
30 天内没有已合并 PR

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

metosin/compojure-api 的其他 Issue

查看 metosin/compojure-api 的全部 Issue

相似的 Issue

更多 Clojure Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。