5

私は JavaScript/Web アプリケーションの初心者で、hunchentoot と backbone.js を使用して最初の Web アプリケーションを実装しようとしています。私が最初に実験したことは、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」であるモデルのフェッチ/保存を処理するように設計されています。fetch は問題なく動作しますが、save() で本当に混乱しました。easy-handler によって起動および処理された「post」リクエストを見ましたが、リクエストには意味のあるヘッダーしかないようで、リクエストに隠された実際の json オブジェクトが見つかりません。だから私の質問は

  1. model.save() によって起動されたポスト リクエストから json オブジェクトを取得し、後で json ライブラリ (jsown など) を使用して解析できるようにするにはどうすればよいですか?
  2. 「保存」が成功したことをクライアントに知らせるために、hunchentoot は何と応答すればよいですか?

hunchentoot で "post-parameters" 関数を試してみたところ、nil が返され、グーグルで hunchentoot+backbone.js を使用している人はあまり見られませんでした。また、backbone.js の save() の仕組みを理解するのに役立つ記事やブログ投稿を教えていただけると助かります。

大変お待たせいたしました!

4

1 に答える 1

9

wvxvw さんのコメントのおかげで、この質問に対する解決策が見つかりました。オブジェクトは、 を呼び出すことで取得できますhunchentoot:raw-post-data。より詳細に説明すると、最初に を呼び出し(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.

これが同じ混乱を抱えている他の人に役立つことを願っています。

于 2012-10-07T04:22:35.203 に答える