2014-05-18 5 views
6

Je me bats pour retourner JSON d'un put! demande:clojure liberator - retourner json à partir d'une demande put

Mon code ressemble à ceci:

(defn body-as-string [ctx] 
    (if-let [body (get-in ctx [:request :body])] 
    (condp instance? body 
     java.lang.String body 
     (slurp (io/reader body))))) 

(defn orbit-world [dimensions ctx] 
    (let [in (json/parse-string (body-as-string ctx))] 
    (json/generate-string in))) 

(defn init-world [params] 
    (let [dimensions (Integer/parseInt params) 
    world (vec (repeat dimensions (vec (take dimensions (repeatedly #(rand-int 2))))))] 
    (json/generate-string world))) 

(defresource world [dimensions] 
    :allowed-methods [:get :put] 
    :available-media-types ["application/json"] 
    :available-charsets ["utf-8"] 
    :handle-ok (fn [_] (init-world dimensions)) 
    :put! (fn [ctx] (orbit-world dimensions ctx))) 

Je veux simplement revenir tout ce qui est passé à la demande de remettre le plus JSON jusqu'à ce que je comprends ce qui se passe.

Mais si je fais une demande de vente, je reçois la réponse suivante:

HTTP/1.1 201 Créé

Date: 18 mai 2014 15:35:32 GMT

Content-type: text/plain

Content-Length: 0

serveur: Jetty (7.6.8.v20121106)

Ma requête GET retourne JSON donc je ne comprends pas pourquoi la demande PUT est pas/

Répondre

6

C'est parce qu'une demande PUT Successfull ne retourne pas http 200 code d'état (au moins selon Libérateur) , il renvoie un code d'état http 201, comme vous pouvez le voir dans la réponse. Liberator gère le code d'état http dans un gestionnaire différent. Afin d'obtenir ce que vous voulez, vous devez faire:

(defresource world [dimensions] 
    :allowed-methods [:get :put] 
    :available-media-types ["application/json"] 
    :available-charsets ["utf-8"] 
    :handle-ok (fn [_] (init-world dimensions)) 
    :put! (fn [ctx] (orbit-world dimensions ctx)) 
    :handle-created (fn [_] (init-world dimensions))) ; Basically just a handler like any other. 

Puisque vous déclarez aucun sur: poignée créés, il est par défaut à une chaîne vide avec un type de contenu text/plain.

Edit:

Pour comprendre plus, vous devez voir le decision graph. Dans là, vous pouvez voir que, après la manipulation put! il va à la prise de décision new?, si c'est vrai aller à handle-created si faux, aller à respond-with-entity? et ainsi de suite.

+1

Cela peut vraiment aider à ajouter le middleware wrap-trace Liberator. Vous obtiendrez alors les en-têtes X-Liberator dans les réponses qui montrent l'état du libérateur à divers points de décision. Il vous montre également quel gestionnaire a été utilisé. Dans ce cas, cela montrerait que le handle-created par défaut était utilisé. –

Questions connexes