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

时间:2011-06-06 14:07:42

标签: ajax json jquery

我现在用Google搜索了一段时间,但只能找到processData: false的内容。我找不到任何经历过同样问题的人。

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

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

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

修改

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

3 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:8)

实际上,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
    ...
});

答案 2 :(得分:0)

图我要添加我目前的理解(截至几个小时。)

  • ProcessData = true:将对象的名称值对转换为URL编码,或将数组的对象转换为名称值对,或将字符串作为文字。
  • ProcessData = false:将字符串作为文字,或调用对象的ToString()方法。

在ProcessData = true之上,通过设置'traditional'标志,它可以使用捕获复杂结构或统一名称值对列表的递归编码将其发送。

因此对于OP而言,由于默认值为true,因此无需指定processData就可以工作。因此,它将对象中的名称值对转换为URLEncoded形式。重新添加该行时,它将调用对象的toString()方法。由于没有toString()方法返回的URL编码的字符串(没有),因此将获得诸如“ [object Object]”的字符串。也许jQuery无法发送未经URL编码的字符串,或者不使用继承的toString()方法。

提出的两个解决方案将对象转换为JSON字符串,因此不进行任何处理,因此processData不执行任何操作。 contentType设置可帮助服务器了解正在发送的内容。

此外,有人评论说处理将编码后的属性添加到URL。不完全是:它通过最合适的方法发送数据; GET表示附加在URL上,而POST表示采用网址编码的http正文。