9

私は peridot を使用しています - https://github.com/xeqi/peridotを使用してリングアプリケーションをテストしていますが、json データで投稿リクエストをモックしようとするまでは正常に動作しています。

(require '[cheshire.core :as json])
(「compojure.core」を使用)

(defn json-post [必須]
  (if (:body req)
    (json/parse-string (slurp (:body req)))))

(すべてのルートをデルートします
  (POST "/test/json" req (json-response (json-post req))))

(def app (compojure.handler/site all-routes))

(「peridot.core」を使用)

(-> (セッション アプリ)
    (リクエスト「/test/json」
             :request-method :post
             :body (java.io.ByteArrayInputStream. (.getBytes "hello" "UTF-8")))

を与えIOException: stream closedます。

これを行うより良い方法はありますか?

4

2 に答える 2

11

tldr:

(-> (session app)
    (request "/test/json"
             :request-method :post
             :content-type "application/json"
             :body (.getBytes "\"hello\"" "UTF-8")))

peridot がリクエスト マップを生成すると、リクエストapplication/x-www-form-urlencodedの content-typeがデフォルトになります:post。指定されたアプリwrap-params( に含まれています) を使用して、フォーム urlencoded パラメータを解析するためにcompojure.handler/siteを読み取ろうとします。:body次に、もう一度json-post読み取りを試みます。:bodyただしInputStream、 s は一度だけ読み取られるように設計されているため、例外が発生します。

この問題を解決するには、基本的に次の 2 つの方法があります。

  1. を削除しcompojure.handler/siteます。
  2. コンテンツ タイプをリクエストに追加します (tldr で行ったように)
于 2013-06-11T03:01:58.827 に答える