发送JSON内容类型+ JavaScript对象(jQuery ajax)

时间:2012-06-01 21:31:41

标签: jquery json

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

我不确定为什么 data2(stringified json)工作正常 但是,data1(json对象)抛出了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);
    }
});

5 个答案:

答案 0 :(得分:6)

如果要发送json字符串,则需要将processData设置为false,否则jQuery将处理传递给数据的内容并将其转换为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

答案 1 :(得分:2)

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

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

有这样的选择,

  1. JS​​ON.stringify(OBJ);它的部分Javascript,我相信来自ECMA 5标准。最简单,但不好的是它在IE6及之前的旧浏览器中不起作用。
  2. jQuery json插件,还有一些额外的功能。
  3. 来自json.org的代码
  4. 所以,现在我的需要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}。但这种情况并非如此。仅当“data”参数的类型不是字符串时,这才有效。如果它不是字符串,则默认行为是将Object转换为url-form-encoding。但是,我认为这几乎是无用的,因为如果你传递一个常规的Object并且processData设置为false,那么它会尝试执行(data).toString,这会导致“[Object] [Object]”,这是非常无用的。

答案 2 :(得分:1)

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

$.ajax({
    type: 'POST',
    url: '/rate',
    data: { rating : 3 },
    dataType: 'json',
    success: function (d) { ... }
}

答案 3 :(得分:0)

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

答案 4 :(得分: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);
        }
    });