如何制作和处理POST请求

时间:2016-10-07 17:00:18

标签: javascript jquery clojure

我有一个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客户端测试它 - 它可以正常工作:

enter image description here

如果我从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客户端请求。

3 个答案:

答案 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);
  }
});