2013-06-11 2 views
8

मैं Peridot उपयोग कर रहा हूँ - https://github.com/xeqi/peridot मेरी अंगूठी आवेदन का परीक्षण करने, और इसके ठीक काम कर रहा जब तक मैं json डेटा के साथ एक पोस्ट अनुरोध उपहास करने के लिए प्रयास करें:मैं अंगूठी में एक जेसन पोस्ट अनुरोध कैसे नकल कर सकता हूं?

 
(require '[cheshire.core :as json]) 
(use 'compojure.core) 

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

(defroutes all-routes 
    (POST "/test/json" req (json-response (json-post req)))) 

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

(use 'peridot.core) 

(-> (session app) 
    (request "/test/json" 
      :request-method :post 
      :body (java.io.ByteArrayInputStream. (.getBytes "hello" "UTF-8"))) 

IOException: stream closed देता है।

क्या ऐसा करने का कोई बेहतर तरीका है?

उत्तर

9

tldr:

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

जब Peridot एक अनुरोध नक्शा यह एक :post अनुरोध के लिए सामग्री प्रकार के लिए application/x-www-form-urlencoded लागू हो जाएगी उत्पन्न करता है। ऐप के साथ wrap-params (जिसे compojure.handler/site द्वारा शामिल किया गया है) के साथ किसी भी फॉर्म-urlencoded पैरामीटर को पार्स करने के लिए :body पढ़ने का प्रयास करेगा। फिर json-post:body को फिर से पढ़ने का प्रयास करता है। हालांकि InputStream एस को एक बार पढ़ने के लिए डिज़ाइन किया गया है, और यह अपवाद का कारण बनता है।

  1. compojure.handler/site निकालें:

    मूल रूप से इस मुद्दे को हल करने के लिए दो तरीके हैं।

  2. .getBytes कॉल करने के लिए, बस :body पैरामीटर के साथ json पारित कोई ज़रूरत नहीं है (जैसा कि tldr में किया) अनुरोध करने के लिए किसी सामग्री प्रकार जोड़ें
4
(require '[cheshire.core :as json]) 

(-> (session app) 
    (request "/test/json" 
      :request-method :post 
      :content-type "application/json" 
      :body (json/generate-string data)) 

संबंधित मुद्दे