1

我在通过 http 请求发送 JavaScript 对象时遇到问题。http endpoing 只接受 json 内容类型(“application/json”或“text/json”)

我不确定为什么 data2 ( stringified json ) 工作正常但是, data1 ( json object ) 抛出 http 400 Bad Request。即为什么 jQuery 不将 json 对象序列化为有效的 json 字符串以供服务器处理。

var data1 = ({ rating : 3 });  //does not work
var data2 = '{ "rating" : 3}'; //works fine

$.ajax({
    url : "/rate",
    data : data1,
    type : "POST",
    contentType: "application/json",
    success: function(json){
        console.log("Ajax Return :"+json);
    }
});
4

5 回答 5

6

如果要发送 json 字符串,需要将 processData 设置为 false,否则 jQuery 将处理传递给 data 的内容并将其转换为 param 字符串。

$.ajax({
    url: "/rate",
    data: data2,
    processData: false,
    contentType: "application/json",
    success: function(json) {
        console.log("Ajax Return :" + json);
    }
});​

我猜最近在这里回答了这个问题:Setting the POST-body to a JSON object with jQuery

于 2012-06-01T21:34:12.850 回答
2

默认情况下,作为任何 ajax jQuery 调用一部分的数据参数值会将 JS 对象转换为 url-form-encoding 即“param1=value¶m2=value”字符串。GET 和 POST 请求都是这种情况。

有趣的是,即使您在 ajax 方法调用中明确指定 { contentType : "application/json" },也只会设置适当的标头,您作为 data 参数值传递的 JS 对象不会转换为 JSON 字符串(始终希望获得更多智能),但仍被编码为 url-form-encoding。因此,必须将 JS 对象显式转换为 JSON 字符串。

有这样做的选择,

  1. JSON.stringify(obj); 它是 Javascript 的一部分,我相信它来自 ECMA 5 标准。最简单,但缺点是它不适用于较旧的浏览器 IE6 及之前的浏览器。
  2. jQuery json 插件,它还具有一些附加功能。
  3. 来自json.org的代码

所以,现在我需要一个 json 主体的 POST 请求将像这样工作。

var dataStr = JSON.stringify({ rating : 3 });  

$.ajax({
    url : "/rate",
    data : dataStr,
    type : "POST",
    contentType: "application/json",
    success: function(json){
        console.log("Ajax Return :"+json);
    }
});

注意:“processData”布尔参数的影响这里的一些答案提到必须设置{ processData:false}。但这种情况并非如此。这仅在“数据”参数的类型不是字符串时才有效。如果它不是字符串,则默认行为是将对象转换为 url-form-encoding。但是,我认为这主要是无用的,因为如果你传递一个常规对象并且 processData 设置为 false,那么它会尝试执行 (data).toString,这会导致“[Object] [Object]”,这是非常没用的。

于 2012-06-01T22:36:29.147 回答
1

将 dataType 设置为 'json' 应该可以。然后你不必使用 JSON.stringify。

$.ajax({
    type: 'POST',
    url: '/rate',
    data: { rating : 3 },
    dataType: 'json',
    success: function (d) { ... }
}
于 2012-12-04T17:07:42.957 回答
0

data1 是一个对象,data2 是一个字符串。它们将被发送到服务器。

于 2012-06-01T21:34:47.827 回答
0

我意识到这是一篇旧帖子,但这是对我有用的解决方案。将 dataType 设置为“json”并完全删除 contentType 应该可以解决问题。这是完整的代码:

var data1 = { rating : 3 };

    $.ajax({
        url : "/rate",
        data : data1,
        dataType: 'json',
        type : "POST",
        //contentType: "application/json",
        success: function(json){
            console.log("Ajax Return :"+json);
        }
    });
于 2015-08-07T08:38:56.750 回答