如果我运行这样的get请求:
$.ajax({
url: 'http://localhost:8000/api/points/',
contentType:"application/json",
dataType: "json",
data: JSON.stringify({"content_type":content_type,"object_id":object_id}),
type: 'GET',
}).error(function(r){ $(output).text('error') })
.success(function(r){
$(output).text(r.count);
})
请求发送至:
http://localhost:8000/api/points/ {%22content_type%22:8,%22object_id%22:40}
显然这很糟糕。如果我不做JSON.stringify()
,它可以正常工作,但为什么会这样?
奇怪的是,如果我做POST
请求,则相反!我必须对数据进行字符串化,否则它将无法正常工作。为什么差异呢?
答案 0 :(得分:0)
首先让我们修复您的请求:
var req = $.ajax({
method: "GET",
url: "http://localhost:8000/api/points/",
dataType: "json", // is you telling jQuery what kind of response to expect.
data : {id : '12345'}
});
req.done(function(data){
// do something with the data
});
req.fail(function(jqXHR, status, err){
// do something in case of failure
throw err;
});
接下来要了解你在做什么:
data
:PlainObject或String或Array
要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它附加到GET请求的URL。 默认情况下,作为对象传入数据选项的数据(技术上,除字符串之外的任何内容)将被处理并转换为查询字符串,适合默认内容类型“application / x-www-form-urlencoded”。
注意: jQuery 1.8中不推荐使用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调。要准备最终删除的代码,请改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。
最后:
不需要JSON.stringify({"content_type":content_type,"object_id":object_id})
,因为使用JSON.stringify
这是一种错误的方法:
{ 'content_type' : 'type', 'object_id' : 'id' }
答案 1 :(得分:0)
Urahara的回答包含一些有用的建议,但似乎没有解决你的问题。
好吧,似乎你的服务器端代码期望在POST请求的主体中找到一个json对象。那为什么会这样?因为您指定内容类型为“application / json”。因此,对于PUT情况,当您使用JSON.stringify时,$ .ajax调用中的数据恰好是表示JSON对象的字符串。这是按原样传递,所以这是有效的。你最终会发送像
这样的东西{“content_type”:8,“object_id”:40}
作为POST请求的正文,您的服务器端代码很乐意处理此问题。不确定你的服务器端技术是什么,但可能它也将content_type绑定到8,将object_id绑定到40,这让你开心:-) 但是当你不使用JSON.stringify将对象转换为JSON字符串时,你最终会将对象本身传递给$ .ajax,让它以它知道的方式将其转换为字符串。好吧,它只知道一个:好的旧网址编码方式。所以服务器仍然期待一个JSON对象,而是得到
CONTENT_TYPE = 8&安培;的object_id = 40
作为PUT请求的主体。它不会幸福。这不是像你承诺的内容类型那样的JSON对象! :-)
现在,继续讨论GET请求的情况。这里的内容类型几乎无关紧要,因为消息体将为空。如果您使用JSON.stringify传递的内容,因为请求数据是一个奇怪的JSON对象,表示字符串以及您作为URL获得的怪物
http://localhost:8000/api/points/ {%22content_type%22:8,%22object_id%22:40}
正如您所预期的那样,服务器不会很好。服务器满意的是
http://localhost:8000/api/points/?content_type=8&object_id=40
当你不使用JSON.stringify时,$ .ajax正是产生了什么,而是传递了一对很好的属性 - 值对。它只是对它们进行url编码,就像在PUT情况下一样,服务器很高兴。
所以$ .ajax总是对由属性 - 值对组成的对象进行url编码。在大多数情况下这很好。修复代码以在不使用JSON.stringify的情况下执行POST的一种方法是简单地不在$ .ajax调用中放入内容类型参数(在这种情况下,默认情况下,'application / x-www-form-urlencoded; charset =将使用UTF-8'。
但是如果你想传递更复杂,更深层次的对象,使用一些对象序列化格式,你必须设置适当的内容类型,并使用像你一样的相应编码(JSON,XML等)将数据作为字符串传递在这里做
希望能回答你的问题:-)