Использование hunchentoot для анализа почтового запроса, отправленного model.save() в Backbone.js
Я новичок в javascript/ веб-приложении и пытаюсь реализовать свое первое веб-приложение, используя hunchentoot и backbone.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 (). Я видел, что запрос "post" был запущен и обработан простым обработчиком, но, похоже, запрос имеет только содержательный заголовок, я не могу найти фактический объект json, скрытый в запросе. Итак, мой вопрос
- Как я могу получить объект json из запроса post, запущенного model.save(), чтобы можно было использовать более позднюю библиотеку json (например, jsown) для его анализа?
- Что должен ответить hunchentoot, чтобы клиент знал, что "save" успешно?
Я попробовал функцию "post-parameters" в hunchentoot, и она возвращает nil, и не видел, чтобы многие люди использовали hunchentoot+backbone.js путем googling. Также полезно, если вы можете направить меня к некоторым статьям / постам в блоге, которые помогут понять, как работает backbone.js save().
Большое спасибо за ваше терпение!
1 ответ
Благодаря комментариям wvxvw я нашел решение этого вопроса. Объект json можно получить, вызвав hunchentoot:raw-post-data
, Чтобы быть более подробным, мы сначала позвоним (hunchentoot:raw-post-data :force-text t)
чтобы получить данные поста в виде строки, а затем передать их jsown:parse
, Полный easy-handler показан ниже:
(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.
Надеюсь, что это помогает другим, у кого такая же путаница.