Clojure Noir Json Put

5

我正在学习Mark McGranaghan REST教程,但是我想使用Noir进行操作。

我可以添加新项目,但它永远不会获取PUT命令的正文。

我认为问题出在我尝试构建PUT语句的方式上。我认为{:keys [id attrs]}是问题所在,因为我试图告诉它json内容在url中,但实际上它在正文中。有人能指导我如何使用noirs defpage从正文中检索它吗?

(put位于单独的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)))

你使用的是哪个版本的noir? - toofarsideways
如果这个问题仍然困扰着您,并且您有一个相关的代码片段,我可能可以试着解决它... 我感觉这是一个非常具体的问题... - toofarsideways
1
我最后使用直接的Compojure完成了它,所以现在我正在使用它。如果我再次尝试使用Noir,我会更新这个问题。 - Dale
1
@Dale 你应该回答并接受自己的问题,这样如果将来有人来到这里,至少他们有一个可能的解决方案。 - Johanna Larsson
3个回答

2

如果您在post请求中传递了"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"}}

1
使用Chris Granger的JSON解析中间件函数,从这里获取它,并按照这里所述的方式使用它来接收JSON数据。
在您的情况下,它将看起来像:
(defpage [:put "/elems/:id"] {{:keys [attr1 attr2 attr3]} :backbone }
         "OK")

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


0

这些是表单参数吗?如果是的话,像你在这里做的那样解构参数应该可以正常工作。您可以使用noir.requestdefpage中获取整个请求。我建议您查看一下它包含的内容,这应该会明确事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接