2017-11-06 17 views
1

この例では、データベースにクエリを出し、すべてのドキュメントをフェッチする単純なAPIを作成しました。応答をjsonオブジェクトとして返すようにしたいと思います。しかし、実際の出力は:{:text "some text", :title "title", :id "1"}{:text "some more text", :title "another title", :id "2"}です。私は非常にclojureに新しいので、おそらく何か明らかに欠けている。クエリ結果をJSONとして返すにはどうしたらいいですか?

handler.clj

(ns app.handler 
    (:use compojure.core) 
    (:use cheshire.core) 
    (:use app.document) 
    (:require [compojure.handler :as handler] 
      [ring.middleware.json :as middleware] 
      [compojure.route :as route])) 

(defroutes app-routes 
      (context "/documents" [] (defroutes documents-routes) 
            (GET "/" [] (list-documents))) 
      (route/not-found "Not Found")) 

(def app 
    (-> (handler/api app-routes) 
     (middleware/wrap-json-body) 
     (middleware/wrap-json-response))) 

storage.clj wrap-json-responseのドキュメント文字列から

(ns app.storage 
    (:import com.mchange.v2.c3p0.ComboPooledDataSource) 
    (:require [clojure.java.jdbc :refer :all])) 

    (def db 
    { 
     :classname "org.sqlite.JDBC" 
     :subprotocol "sqlite" 
     :subname  "src/storage/sqlite.db" 
    } 
) 

document.clj

(ns app.document 
    (:use app.storage) 
    (:use ring.util.response) 
    (:require [clojure.java.jdbc :refer :all])) 

(defn list-documents [] 
    (let [results (query db ["select * from documents"])] 
    (prn results) 

    (cond (empty? results) 
      (not_found()) 
      :else 
      (response (lazy-seq results))))) 
+1

私のために働きます。条件では、応答はマップであり、遅延セグではありません。 – akond

答えて

2

Middleware that converts responses with a map or a vector for a body into a JSON response.

。あなたはそれにシーケンスを与えていますが、マップやベクトルだけを受け取ります。 (response (lazy-seq results))(response (vec results))に変更してください。

編集:私の全回答を変更しました。私は誤解しました。

+0

ありがとう! ring.util.responseを使ってこれを達成する方法はありませんか? – Freid001

+0

'' json-response'の[source](https://github.com/ring-clojure/ring-json/blob/master/src/ring/middleware/json.clj#L100)を見ると、それは非常にシンプルであることがわかります。これは、ボディをclojureデータ構造からjsonに変換し、適切なヘッダを設定します。あなたはその機能をかなり簡単に複製することができますが、私は依存関係を追加するだけです。ライブラリ全体の125行のコードでは、それほど大きな問題ではありません。 – madstap

+0

私はあなたが与えた例を試しましたが、私はこのエラーを受け取ります:clojure.lang.LazySeqはclojure.lang.IFnにキャストできません – Freid001

関連する問題