Использование 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, скрытый в запросе. Итак, мой вопрос

  1. Как я могу получить объект json из запроса post, запущенного model.save(), чтобы можно было использовать более позднюю библиотеку json (например, jsown) для его анализа?
  2. Что должен ответить 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.

Надеюсь, что это помогает другим, у кого такая же путаница.

Другие вопросы по тегам