14

关于这条线:

var data = encodeURIComponent(JSON.stringify(object_literal));

我不明白为什么这是 URI 编码的。

稍后的数据将通过 发送ajax POST

我了解 URL,尤其是您可以在浏览器地址栏中看到的 URL,需要特殊字符,如下所述:

http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

但这与 Ajax 发布究竟有什么关系呢?

url 地址栏和内部 ajax 帖子是否使用相同的机制?

4

4 回答 4

23

这完全取决于内容类型

通常,当 a<form>使用 HTTP 方法 POST 时,表单值会被URL 编码并放置在请求的正文中。内容类型标头如下所示:

content-type: application/x-www-form-urlencoded

大多数 AJAX 库将默认执行此操作,因为它在 Web 服务器中被普遍接受。但是,没有什么能阻止您将数据简单地序列化为 JSON 或 XML,然后使用不同的内容类型发送它。

content-type: application/json

或者

content-type: text/xml

值得注意的是,payload 与 AJAX 无关!在后台,他们都使用XmlHttpRequest对象向服务器异步发送 HTTP 请求。发送纯文本、JSON、XML 甚至原始二进制数据都没有关系,只要告诉服务器如何解释这些位即可。

url 编码纯粹是<form>在 AJAX 出现之前元素如何将其数据发布到服务器的历史产物。

于 2013-08-22T13:36:25.153 回答
6

乔希的回答很好,但我认为它遗漏了一些东西。传统上,表单数据使用与查询字符串相同的格式发布。例如:param1=value1&param2=value2GET 和 POST 之间的唯一区别是 POST 将这些参数放在消息正文中,而 GET 将它们放在 URL 中。但是,明显的问题是,如果您的参数名称或值包含非转义字符,例如&and =,那么您将破坏服务器自动解析参数集合的能力,从而导致数据损坏。在每个参数值上使用 Javascript 的encodeURIComponent()函数将为您转义所有这些字符。

所以底线:如果你没有在服务器端使用旧的标准参数集合——例如,如果你正在解析 JSON——那么就不需要对文本进行 URL 编码。此外,如果您不在服务器端解析多个参数,则没有理由进行 URL 编码,因此encodeURIComponent在整个消息正文上运行一次是没有意义的。

旁注:如果您使用 asp.net 并试图让用户将 html 传递给服务器,encodeURIComponent将允许您在不禁用通常禁止此操作的请求验证的情况下执行此操作。我不认为单独将其作为 JSON 发送会完成此任务。

于 2015-07-08T12:50:25.013 回答
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 的例子

https://stackoverflow.com/a/18302867/2450730

于 2013-08-22T13:58:57.197 回答
0

不,他们没有。Ajax通过POST作为数据发送时不需要它。

您可以使用 AJAX 发送未编码的纯 JSON

var ajaxObject = $.ajax({
    url: 'url',
    type: 'POST',
    data: JSON.stringify(object_literal);
}); 
于 2013-08-22T13:32:15.620 回答