我在谷歌上搜索了一段时间,只能找到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不会抛出任何错误。它不会触发请求。
3条答案
按热度按时间kmynzznz1#
您希望将数据作为JSON传递。您正在传递一个JavaScript对象。JSON是一种将JavaScript对象序列化为字符串的方法,这样它们就可以在没有兼容性问题的情况下传递。
实际上,您希望在字符串中传递JSON:
字符串
xxslljrj2#
实际上,默认情况下,
processData
假设传入的data
是一个对象,并将其作为application/x-www-form-urlencoded
发送。总结@lonesomeday和@vsm上面所说的发送原始JSON(* 与表单数据的不同之处 *),您需要:
字符串
6za6bjd03#
图我会添加我目前的理解(作为几个小时..)
在ProcessData = true之上,通过设置'traditional'标志,它可以使用捕获复杂结构的递归编码或平面名称值对列表来发送它。
因此,对于OP,它在没有指定processData的情况下工作,因为默认值为true。因此它将对象中的名称/值对转换为URLEncoded形式。当您将该行添加回时,它将调用对象的toString()方法。由于toString()方法没有返回URL编码的字符串(您没有),因此您将获得一个字符串,如“[object Object]"。也许jQuery不能发送没有URL编码的字符串,或者没有使用继承的toString()方法。
这两个解决方案将对象转换为JSON字符串,因此没有处理,因此processData什么也不做。contentType设置帮助服务器了解正在发送的内容。
此外,有人评论说,处理将编码的属性添加到URL中。不完全是:它通过最合适的方法发送数据; GET表示附加到URL,POST表示URL编码的http主体。