关于这一行:
var data = encodeURIComponent(JSON.stringify(object_literal));
我不明白为什么这是URI编码。
以后的数据将通过ajax POST
发送。
我了解网址,尤其是您在浏览器地址栏中可以看到的网址,需要使用此处所述的特殊字符:
http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
但这究竟与Ajax发布有什么关系呢?
url地址栏和内部ajax帖子都使用相同的机制吗?
答案 0 :(得分:20)
这完全取决于content type。
通常,当<form>
使用HTTP方法POST时,表单值为URL Encoded并放置在reqeust的正文中。内容类型标题如下所示:
content-type: application/x-www-form-urlencoded
大多数AJAX库默认都会这样做,因为它在Web服务器中被普遍接受。但是,没有什么可以阻止您简单地将数据作为JSON或XML进行分类,然后使用不同的内容类型发送它。
content-type: application/json
或
content-type: text/xml
值得注意的是,有效负载与AJAX无关!在幕后他们都使用XmlHttpRequest对象向服务器异步发送HTTP请求。如果您发送纯文本,JSON,XML甚至原始二进制数据并不重要,只要您告诉服务器如何解释这些位。
网址编码纯粹是{AJ}周围<form>
元素将数据发布到服务器的历史工件。
答案 1 :(得分:6)
Josh的回答很好,但我认为它缺少一些东西。传统的表单数据使用与查询字符串相同的格式发布。例如:param1=value1¶m2=value2
并且GET和POST之间的唯一区别是POST将这些参数放在消息体中,而GET将它们放在URL中。但是,显而易见的问题是,如果您的参数名称或值包含未转义的字符,如&
和=
,那么您将搞砸服务器自动解析参数集合的能力,从而导致损坏数据。在每个参数值上使用Javascript的encodeURIComponent()
函数将为您转义所有这些字符。
所以底线:如果你没有在服务器端使用旧的标准参数集合 - 例如,如果你正在解析JSON - 那么就不需要对文本进行URL编码。此外,如果您没有解析服务器端的多个参数,则没有理由进行URL编码,因此在整个邮件正文中运行encodeURIComponent
一次是没有意义的。
旁注:如果您正在使用asp.net并尝试让用户将html传递给服务器,encodeURIComponent
将允许您执行此操作而不会禁用通常禁止此操作的请求验证。我不认为发送它作为JSON,单独,将完成这一点。
答案 2 :(得分:2)
encodeURIComponent
是使用GET
JSON.stringify()
自动编码为utf8
仅在极少数情况下,例如当你想将奇怪的字符串转换为base64时,encodeURIComponent
在GET之外使用。
这是一个例子
base64_encode=function(a){
return window.btoa(unescape(encodeURIComponent(a)));
};
https://developer.mozilla.org/en-US/docs/Web/API/window.btoa
说... ..
如果您使用REST API
服务每个 ajax GET request
这是一个字符串参数,需要使用encodeURIComponent
进行编码。
这是一个使用yql的例子
答案 3 :(得分:0)
不,他们没有。通过Ajax
POST发送数据时,不需要它。
您可以使用AJAX
发送未编码的纯JSONvar ajaxObject = $.ajax({
url: 'url',
type: 'POST',
data: JSON.stringify(object_literal);
});