在使用jquery ajax执行GET请求时,为什么我不能将json数组作为数据传递?

时间:2015-03-17 04:26:53

标签: javascript jquery ajax

如果我运行这样的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请求,则相反!我必须对数据进行字符串化,否则它将无法正常工作。为什么差异呢?

2 个答案:

答案 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等)将数据作为字符串传递在这里做

希望能回答你的问题:-)

请同时查看http://api.jquery.com/jquery.ajax/