Использование 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-адрес которой «/ набор данных». Выборка работает нормально, но меня очень смутил save(). Я видел запрос «post», запущенный и обработанный easy-handler, но запрос, похоже, имеет только значимый заголовок, я не могу найти фактический объект json, скрытый в запросе. Итак, мой вопрос

  1. Как я могу получить объект json из почтового запроса, запущенного model.save(), чтобы для его анализа можно было использовать более позднюю библиотеку json (например, jsown)?
  2. Что должен ответить hunchentoot, чтобы сообщить клиенту, что «сохранение» прошло успешно?

Я попробовал функцию «пост-параметры» в hunchentoot, и она возвращает nil, и не видел много людей, использующих hunchentoot+backbone.js при поиске в Google. Также полезно, если вы можете направить меня к некоторым статьям/сообщениям в блогах, которые помогут понять, как работает save() backbone.js.

Большое спасибо за ваше терпение!


person BreakDS    schedule 06.10.2012    source источник
comment
Спасибо! Я думаю, что raw-post-data правильный ответ. На самом деле я пробовал это, прежде чем задавать вопрос, но снабдил его неправильным аргументом.   -  person BreakDS    schedule 07.10.2012


Ответы (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.

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

person BreakDS    schedule 07.10.2012