我正在努力从投注中返回JSON!请求:
我的代码如下所示:
(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)))
我只是想以JSON的形式返回传递给put请求的任何内容,直到我明白发生了什么为止。
但是如果我发出一个put请求,我会得到以下回复:
HTTP / 1.1 201已创建
日期:太阳,2014年5月18日15:35:32 GMT
Content-Type:text / plain
内容长度:0
服务器:Jetty(7.6.8.v20121106)
我的GET请求返回JSON,所以我不明白为什么PUT请求不是/
答案 0 :(得分:6)
这是因为成功的PUT请求不返回http 200状态代码(至少根据解放器),它返回一个http 201状态代码,正如您从响应中看到的那样。 Liberator在不同的处理程序中处理每个http状态代码。为了达到你想要的目的,你必须这样做:
(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.
由于你在:handle-created上声明了none,它默认为一个带有text / plain内容类型的空字符串。
编辑:
为了了解更多信息,您必须查看decision graph。在那里,您可以看到在处理put!
之后,它会转到决策处理new?
,如果它是真的,请转到handle-created
如果为false,请转到respond-with-entity?
并等等。