5

我正在完成教程Mark McGranaghan REST 教程,但是我正在尝试使用 Noir 来代替。

我可以添加新项目,但它永远不会占用 PUT 命令的主体。

我认为我如何尝试构建 put 语句的问题。我认为 {:keys [id attrs]} 是问题所在,因为我试图告诉它 json 内容在 url 中,而不是在正文中。谁能建议我如何使用 noirs defpage 从身体中检索它?

(放在单独的 elem 文件中)

(defn put [id attrs]
  (let [new-attrs (merge (get id) attrs)]
  (swap! elems assoc id new-attrs)
  new-attrs))

(defpage [:put "/elems/:id"] {:keys [id attrs]}
  (json-response (elem/put id attrs)))
4

3 回答 3

2

如果您在帖子中传递“attrs=somevalue”,那么这将起作用,但如果您尝试捕获所有键值对,这在 1.3.0-beta1 中适用于我:

(defpage [:put "/elems/:id"] attrs 
  (response/json {:attrs attrs}))

然后:

$ curl -H "Accept: application/json" -X PUT -d "foo=bar" http://localhost:8080/elems/123
=> {"attrs":{"id":"123","foo":"bar"}}
于 2012-04-29T02:33:24.363 回答
1

从这里使用 Chris Granger 的 JSON 解析中间件函数,并按照这里的描述使用它来接收 JSON 数据。

在你的情况下,它看起来像

(defpage [:put "/elems/:id"] {{:keys [attr1 attr2 attr3]} :backbone }
         "OK")

但是您只需要先添加那个“主干”(我个人将其重命名为“json-params”)中间件。

于 2012-05-17T03:34:02.793 回答
0

那么这些是表单参数吗?如果是这样,像您在此处所做的那样解构参数应该可以正常工作。您可以使用noir.request. 我会看看它,看看它包含什么。它应该显着地澄清事情。

于 2012-04-28T19:41:50.403 回答