我有一个Clojure服务:
(ns cowl.server
(:use compojure.core)
(:require [ring.adapter.jetty :as jetty]
[ring.middleware.params :as params]
[ring.middleware.json :as wrap-json]
[ring.util.response :refer [response]]
[clojure.data.json :as json]
[cowl.settings :as settings]
[cowl.db :as db]))
(defn set-as-readed [body]
(println body)
(db/set-as-readed settings/db (:link body))
(str "ok"))
(defroutes main-routes
(POST "/api/news/as-read" { body :body } (set-as-readed body)))
(def app
(-> main-routes
wrap-json/wrap-json-response
(wrap-json/wrap-json-body { :keywords? true })))
如果我使用REST客户端测试它 - 它可以正常工作:
如果我从jQuery使用它,我有一个错误:
$.ajax({
url: 'http://localhost:3000/api/news/as-read',
dataType: 'json',
type: 'POST',
data: JSON.stringify( { link: news.link } ),
success: function(data) {
console.log(data);
},
error: function(xhr, status, error) {
console.log(error);
}
});
以下是来自服务器的日志:
{:link http://www.linux.org.ru/news/internet/12919692}
#object[org.eclipse.jetty.server.HttpInputOverHTTP 0x11724c56 HttpInputOverHTTP@11724c56]
来自REST客户端的第一条消息,第二条来自我的AJAX jQuery请求?
我在哪里犯了错误? REST客户端工作正常。所以我可以建议服务器是正确的。为什么服务器无法解析来自jQuery的请求?
更新:我可以通过以下方式解决问题:
(json/read-str (slurp body)
在服务器端。在这种情况下,我可以使用我的jQuery请求,但无法解析REST客户端请求。
答案 0 :(得分:2)
ring JSON中间件使用Content-Type
标头来检测和解析JSON有效负载。很可能来自jQuery的请求要么省略此标头,要么使用默认值,因此请求主体将您的处理程序显示为原始文本流。
从jQuery docs开始,dataType
告诉jQuery您在响应中期待的数据类型。您似乎希望将contentType
参数设置为"application/json"
。
答案 1 :(得分:1)
您必须通过更改标题响应向请求者说明您正在发送文本或json:
(-> (ring-resp/response (str "Ok"))
(ring-resp/header ("Content-Type" "text/plain")))
;; or application/json if convenient
答案 2 :(得分:0)
试试这个
$.ajax({
url: 'http://localhost:3000/api/news/as-read',
dataType: 'json',
type: 'POST',
data: {
link: news.link
},
success: function(data) {
console.log(data);
},
error: function(xhr, status, error) {
console.log(error);
}
});