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

4nkexdtk  于 12个月前  发布在  jQuery
关注(0)|答案(3)|浏览(71)

我在谷歌上搜索了一段时间,只能找到processData: false的功能。我找不到任何人经历过同样的问题。
我将JSON传递回服务器,不希望jQuery自动将数据转换为查询字符串,因此我将processData设置为false。如果我取出processData,我可以看到请求被触发,但是一旦我把它放进去,我就没有看到任何请求被发出(使用Firebug和Chrome开发工具)。

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

字符串
我最初提出的请求比这个要复杂一些,但是我已经简化了它,试图缩小问题的范围,但是这段简单的代码也不起作用(同样,如果我注解掉processData,它就起作用了)。另外,我在控制台中没有看到任何JavaScript错误。

编辑

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

kmynzznz

kmynzznz1#

您希望将数据作为JSON传递。您正在传递一个JavaScript对象。JSON是一种将JavaScript对象序列化为字符串的方法,这样它们就可以在没有兼容性问题的情况下传递。
实际上,您希望在字符串中传递JSON:

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

字符串

xxslljrj

xxslljrj2#

实际上,默认情况下,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
    ...
});

字符串

6za6bjd0

6za6bjd03#

图我会添加我目前的理解(作为几个小时..)

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

在ProcessData = true之上,通过设置'traditional'标志,它可以使用捕获复杂结构的递归编码或平面名称值对列表来发送它。
因此,对于OP,它在没有指定processData的情况下工作,因为默认值为true。因此它将对象中的名称/值对转换为URLEncoded形式。当您将该行添加回时,它将调用对象的toString()方法。由于toString()方法没有返回URL编码的字符串(您没有),因此您将获得一个字符串,如“[object Object]"。也许jQuery不能发送没有URL编码的字符串,或者没有使用继承的toString()方法。
这两个解决方案将对象转换为JSON字符串,因此没有处理,因此processData什么也不做。contentType设置帮助服务器了解正在发送的内容。
此外,有人评论说,处理将编码的属性添加到URL中。不完全是:它通过最合适的方法发送数据; GET表示附加到URL,POST表示URL编码的http主体。

相关问题