我有一个 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 客户端,第二条消息来 self 的 AJAX jQuery 请求?
我哪里出错了? REST 客户端工作正常。所以我可以建议服务器是正确的。为什么服务器无法解析来自 jQuery 的请求?
更新:我可以通过以下方式解决问题:
(json/read-str (slurp body)
在服务器端。在这种情况下,我可以处理我的 jQuery 请求,但无法解析 REST 客户端请求。
最佳答案
环形 JSON 中间件使用 Content-Type
header 来检测和解析 JSON 负载。来自 jQuery 的请求很可能会省略此 header 或使用默认值,因此请求正文会以原始文本流的形式显示给您的处理程序。
来自jQuery docs看起来 dataType
告诉 jQuery 您希望在响应 中使用什么数据类型。看起来您想将 contentType
参数设置为 "application/json"
。
关于javascript - 如何发起和处理 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39922505/