2011-06-06 93 views
13

我已经搜索了一段时间,只能找到processData:false的用处。我找不到遇到过这个问题的人。jQuery Ajax - 将processData设置为false打破了我的AJAX请求

我将JSON传递回服务器,并且不希望jquery自动将数据转换为查询字符串,因此我将pr​​ocessData设置为false。如果我取出processData,我可以看到请求开火,但是一旦我放入,我就看不到任何请求(使用Firebug & Chrome开发工具)。

$.ajax({ 
      url: myUrl, 
      type: "POST", 
      data: {foo: "bar"}, 
      processData: false, 
      contentType: 'application/json' 
     }); 

我最初做是有点比这更复杂,但我已经简化它,试图缩小问题,但这个简单的代码无法正常工作或(再次,它的工作,如果该请求我注释掉processData)。另外,我在控制台中没有看到任何Javascript错误。

任何帮助将不胜感激!

编辑对于未来的Google员工:正如寂寞天指出的,如果您提供JS对象或格式不正确的JSON字符串,jQuery不会抛出任何错误。它根本不会触发请求。

回答

13

您想将数据作为JSON传递。你正在传递一个Javascript对象。 JSON是一种将JavaScript对象序列化为字符串的方式,以便它们可以在没有兼容性问题的情况下传递。

实际上,你想通过JSON字符串中的:

$.ajax({ 
    url: myUrl, 
    type: "POST", 
    data: '{"foo": "bar"}', 
    processData: false, 
    contentType: 'application/json' 
}); 
+0

非常感谢!我意识到我最初发送的更复杂的数据也格式不正确。有趣的是,jQuery在尝试解析错误的JSON字符串时不会引发任何错误。 – paz 2011-06-06 14:34:11

+3

自从这篇文章已经有一段时间了,但我想添加到@lonesomday,如果你想避免把''手工放在每个属性/值你可以做JSON.stringify(),就这些了。 – vsm 2011-11-27 03:04:10

+6

但是,processData还能做什么? – getsetbro 2014-09-18 18:26:32

5

其实,processData默认假定data传递是一个对象,并且将其作为application/x-www-form-urlencoded

总结一切由@lonesomeday@vsm上面说要送生JSON(什么是从表单数据不同),你需要:

$.ajax({ 
    url: 'http://here-i.am/send-me/an/angel', // Determining far end 
    data: JSON.stringify({foo: "bar"}), // Obtaining proper JSON string from data object 
    processData: false, // Preventing default data parse behavior 
    contentType: "application/json" // Setting proper `ContentType` for our data 
    ... 
});