我是javascript /网络应用程序的新手,并尝试使用hunchentoot和bone.js来实现我的第一个网络应用程序。我正在尝试的第一件事是了解model.fetch()和model.save()的工作方式。
在我看来,model.fetch()触发“ GET”请求,而model.save()触发“ POST”请求。因此,我在hunchentoot中编写了一个易于处理的代码,如下所示:
(hunchentoot:define-easy-handler (dataset-handler :uri "/dataset") ()
(setf (hunchentoot:content-type*) "text/html")
;; get the request type, canbe :get or :post
(let ((request-type (hunchentoot:request-method hunchentoot:*request*)))
(cond ((eq request-type :get)
(dataset-update)
;; return the json boject constructed by jsown
(jsown:to-json (list :obj
(cons "length" *dataset-size*)
(cons "folder" *dataset-folder*)
(cons "list" *dataset-list*))))
((eq request-type :post)
;; have no idea on what to do here
....))))
这旨在处理其相应URL为“ / dataset”的模型的获取/保存。提取工作正常,但我对save()感到非常困惑。我看到了由easy-handler触发并处理的“ post”请求,但是该请求似乎只有有意义的标头,我无法找到隐藏在请求中的实际json对象。所以我的问题是
如何从model.save()触发的发布请求中获取json对象,以便以后的json库(例如jsown)可以用来解析它?
为了让客户知道“保存”成功,hunchentoot应该回复什么?
我在hunchentoot中尝试了“ post-parameters”函数,该函数返回nil,并且没有看到很多人通过谷歌搜索来使用hunchentoot + backbone.js。如果您可以引导我进入一些文章/博客文章,这有助于您理解ribs.js save()的工作原理,那么这也很有帮助。
非常感谢您的耐心配合!
最佳答案
感谢wvxvw的评论,我找到了解决该问题的方法。可以通过调用hunchentoot:raw-post-data
来检索json对象。更详细地说,我们首先调用(hunchentoot:raw-post-data :force-text t)
以字符串形式获取帖子数据,然后将其提供给jsown:parse
。完整的便捷处理程序如下所示:
(hunchentoot:define-easy-handler (some-handler :uri "/some") ()
(setf (hunchentoot:content-type*) "text/html")
(let ((request-type (hunchentoot:request-method hunchentoot:*request*)))
(cond ((eq request-type :get) ... );; handle get request
((eq request-type :post)
(let* ((data-string (hunchentoot:raw-post-data :force-text t))
(json-obj (jsown:parse data-string))) ;; use jsown to parse the string
.... ;; play with json-obj
data-string))))) ;; return the original post data string, so that the save() in backbone.js will be notified about the success.
希望这能帮助那些同样困惑的人。