在jQuery中将processData设置为false会破坏我的AJAX请求

paz*_*paz 16 ajax jquery json

我已经google了一段时间,只能找到processData: false它.我找不到任何经历过同样问题的人.

我正在将JSON传递回服务器,并且不希望jQuery自动将数据转换为查询字符串,因此我将pr​​ocessData设置为false.如果我拿出processData,我可以看到请求被触发,但是一旦我把它放进去,我就看不到任何请求(使用Firebug和Chrome开发工具).

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

我最初提出的请求比这更复杂,但我已经简化了它以尝试缩小问题范围,但这段简单的代码也不起作用(再次,如果我注释掉processData,它确实有效).此外,我没有在控制台中看到任何JavaScript错误.

编辑

对于未来的网络搜索者:正如lonesomeday所指出的,如果你提供JS对象或格式不正确的JSON字符串,jQuery不会抛出任何错误.它根本不会触发请求.

lon*_*day 17

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

您实际上想要在字符串中传递JSON:

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

  • 但是,processData做了什么呢? (6认同)
  • 自从这篇文章以来已经有一段时间但是我想添加到@lonesomday如果你想避免手工放置每个属性/值,你可以做JSON.stringify(<a jason object>),这就是全部. (3认同)
  • `processData`在这里什么也不做。当您将字符串传递给`data`时(如本例所示),jQuery将不会对其进行处理。 (2认同)

Pau*_*een 9

实际上,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
    ...
});
Run Code Online (Sandbox Code Playgroud)