6

編集-興味があれば、ソースコードはgithubにあります。ありがとう


clojureのURLに投稿されたjsonデータにアクセスする方法について少し混乱しています。私はそれを機能させることができないようです。

これが私のルートです:

(cc/POST "/add" 
request
(str ": " request))

何を代わりに使用する必要があるのか​​完全にはわかりませんrequest。オンラインでブログを見てフォローしようとしましたが、機能させることができませんでした。

これが私が投稿しようとしている方法です:(フィドルから)

フィドラー投稿データ

注:リクエストヘッダーポートは画像で異なります。それは間違いです、私はそれが何を言っているかを見るためにそのデータをいじろうとしていましたので、上の画像のその部分を無視してください

カールでは、私はこれをやっています:

curl -X POST -H "Content-Type: application/json" -d '{"foo":"bar","baz":5}' 
     http://localhost:3005/add

clojureは私が投稿したjsonデータをまったく受信していないようです。

リクエスト変数に含まれるものは次のとおりです。

: {:scheme :http, :query-params {}, :form-params {}, :request-method :post, 
   :query-string nil, :route-params {}, :content-type "\"application/json\"", 
   :uri "/event", :server-name "localhost", :params {}, 
   :headers {"user-agent" "Fiddler", "content-type" "\"application/json\"", 
          "content-length" "23", "host" "localhost:3005"}, 
   :content-length 23, :server-port 3005, :character-encoding nil, :body #}

ご覧のとおり、すべてparamsが空です...

私はcompojureとcheshireを使用しています。データをjsonに変換して、GETルートに問題なく返すことができます。jsonを渡してclojureデータに変換する方法を理解する必要があります。

ありがとう

4

3 に答える 3

8

これは、:paramsが「フォームエンコード」本体を処理するリングミドルウェアで埋められているためです。

ring-jsonを使用して、アプリケーションをこの他のミドルウェアにラップできます。JSON本体を解析し、それに応じて:paramsを入力します。(https://github.com/ring-clojure/ring-json

于 2013-02-05T15:08:10.133 に答える
1

これがあなたが望むことをする例です。コードはこのプロジェクトから取得されました。READMEには、これがサポートするアクセスパターンのいくつかが表示されます。コードは少し厄介ですが、これを行う方法を説明する必要があります。

(ns poky.protocol.http.jdbc.text
  (:require [poky.kv.core :as kv]
    (compojure [core :refer :all]
               [route :as route]
               [handler :as handler])
    [ring.util.response :refer [response not-found]]
    (ring.middleware [format-response :as format-response ]
                     [format-params :as format-params])
    [cheshire.core :as json]
    [ring.middleware.stacktrace :as trace]))

;
; curl -d"some data" -H'Content-Type: application/text' -v -X PUT http://localhost:8080/xxx
; curl -d'{"bla":"bar"}' -H'Content-Type: application/json' -v -X PUT http://localhost:8080/bla

(def valid-key-regex #"[\d\w-_.,]+")

; FIXME: this should be split- one fn for get, one for mget
(defn- wrap-get
  [kvstore ks params headers body]
  (response 
    (let [eks (clojure.string/split ks #",")
          nks (count eks)
          multi (> nks 1)
          ret (if multi (kv/mget* kvstore eks) (kv/get* kvstore ks))]
    (condp = (get headers "accept")
      "application/json" ret
      "text/plain" (if multi (throw (Exception. "Multi get unsupported with Accept: text/plain")) (get ret ks))
      ret))))



(defn- wrap-put
  [kvstore ks params headers body]
  (if (and 
        (= (get headers "content-type") "application/json")
        (get params (keyword ks) nil))
    (kv/set* kvstore ks (get params (keyword ks)))
    (kv/set* kvstore ks body))
  (response ""))

(defn api
  [kvstore]
  (let [api-routes
        (routes
          (GET ["/:ks" :ks valid-key-regex] {{:keys [ks] :as params} :params body :body headers :headers}
               (wrap-get kvstore ks params headers body))
          (PUT ["/:ks" :ks valid-key-regex] {{:keys [ks] :as params} :params 
                                             body :body body-params :body-params headers :headers} 
               (let [body (slurp body)
                     body (if (empty? body) body-params body)]
                 (wrap-put kvstore ks params headers body))))]

    (-> (handler/api api-routes)
        (format-params/wrap-format-params
          :predicate format-params/json-request?
          :decoder #(json/parse-string % true)
          :charset format-params/get-or-guess-charset)
        (format-response/wrap-format-response
          :predicate format-response/serializable?
          :encoders [(format-response/make-encoder json/encode "application/json")
                     (format-response/make-encoder identity "text/plain")]
          :charset "utf-8")
        trace/wrap-stacktrace)))

お役に立てれば。

于 2013-04-11T20:36:22.367 に答える
0

以前の回答を更新するだけで、formatsRingによって処理される形式のリストを含むキーをハンドラーに追加するのに十分です。

だから何かのような

(def app (noir.util.middleware/app-handler 
           [your-routes]
           :formats [:json-kw]))
于 2016-12-14T10:02:29.650 に答える