我在通过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);
}
});
答案 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字符串。
有这样的选择,
所以,现在我的需要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);
}
});