2

我确定我一定做错了什么......这是clojure的相关行:

(ns command.command-server
  (:use [org.httpkit.server :only [run-server]])
  (:use [storage.core-storage])
  (:use compojure.core)
  (:use [command.event-loop :only [enqueue]])
  (:require [compojure.handler :as handler]
            [compojure.route :as route]
            [ring.middleware.json :as middleware]))


(def app
  (-> (handler/api app-routes)
    (middleware/wrap-json-body)
    (middleware/wrap-json-response)
    (middleware/wrap-json-params)))


;in app-routes, the rest left out for brevity
  (POST "/request" {json :params} 
        (do              
          (queue-request json)
          (response {:status 200})
          ))

(defn queue-request [evt]
  (let [new-evt (assoc evt :type (keyword (:type evt)))]
    (println (str (type (:val1 evt)))) 
    (enqueue new-evt)))

当我从 jquery 发送以下内容时,末尾附近的“println”将 :val1 的类型显示为 java.lang.String:

$.ajax({
    type: "POST",
    url: 'http://localhost:9090/request',
    data: {type: 'add-request', val1: 12, val2: 50},
    success: function(data){
        console.log(data);
    }
});

那么我做错了什么?

4

1 回答 1

0

这可能取决于 jQuery 请求,而不是环中间件。

老实说,我对 jQuery 了解不多,但我只是遇到了这个答案,看起来它可以解释正在发生的事情。简而言之,查询中的数据将被编码为 URL 中的字符串。这些将被 ring 解析为字符串,而不是整数,因为 URL 编码没有指定类型。如果您想要 JSON 编码,则需要明确指定它。像这样:

$.ajax({
    type: "POST",
    url: 'http://localhost:9090/request',
    data: JSON.stringify({type: 'add-request', val1: 12, val2: 50}),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function(data){
    console.log(data);
});
于 2013-07-27T19:32:44.017 回答