javascript - 如何发起和处理 POST 请求

标签 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 客户端,第二条消息来 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/

相关文章:

javascript - 页面加载后如何执行 jquery 动画滚动?

javascript - 使用 jQuery 或 Mootools 显示 Rokbox 弹出窗口

clojure - datomic:事务函数没有真正写入数据库

logging - clojure 中的惯用日志记录

javascript - 如何将 angularjs ui bootstrap 工具提示动态添加到现有标记?

javascript - 在谷歌地图中拖动时如何从标记下方删除十字

javascript - 在函数内添加 javascript 全局变量

javascript - 有没有办法在 Vue JS 的路由之前在全局中指定 'any' 路由?

php - 使用 Yii,有没有办法通过 CDbCriteria 添加 AS 进行查询

java - 将 Clojure 夹在 Java 与 Leiningen 之间