4

少し前に、Chris Granger がこのミドルウェアを投稿して、JSON ハッシュを「バックボーン」要素の下の defpage パラメータに表示するようにしました。

(defn backbone [handler]
  (fn [req]
    (let [neue (if (= "application/json" (get-in req [:headers "content-type"]))
       (update-in req [:params] assoc :backbone (json/parse-string (slurp (:body req)) true))
       req)]
    (handler neue))))

このコードを変更して、JSON 要素が defpage の最上位パラメーターとして表示されるようにするにはどうすればよいですか。つまり、:backbone アンブレラを取り除くには?

4

3 に答える 3

3

できることは 2 つあります。:params1 つのオプションは、JSON の解析後に返されたマップでの値を置き換えることです。そのためには、新しいマップを:paramsキーに関連付けるだけです。

(assoc req [:params] (json/parse-string (slurp (:body req)) true))

もう 1 つのオプション (@dAni が提案) は、解析された JSON の値をマージして、:paramsマップ内の既存の値が上書きされないようにすることです。partialここで使用する代わりに使用する必要があるmerge理由は、最終的なマップが左から右へのマップのマージ結果であるためです。JSON マップの値を優先する場合、ソリューションは機能します。

(update-in req [:params]
  (partial merge (json/parse-string (slurp (:body req)) true)))
于 2012-05-17T15:51:50.217 に答える
0

とった。 assoc1 つの要素に対してのみ機能するため、すべてを:backbone傘の下に置く必要があります。すべての JSON 要素をパラメーターにプッシュするには、 merge. 4 行目を次のように変更します。

(update-in req [:params] merge (json/parse-string (slurp (:body req)) true))
于 2012-05-17T16:41:30.420 に答える
-1

別の依存関係を取り込むことを気にしない場合は、ring-middleware-format ライブラリを使用できます。

指示:

  • [ring-middleware-format "0.1.1"]あなたに追加project.clj

  • 次に、server.cljに次のコードを追加します。

コード:

(:require [ring.middleware.format-params :as format-params])

(server/add-middleware format-params/wrap-json-params)

(defn -main [& m]
; Start the server...
)

これで、フォームの POSTdata と同じように、受信する JSON を使用できるようになります。

于 2012-07-22T08:12:28.233 に答える