ajax发布数据是否需要进行URI编码?

时间:2013-08-22 13:25:12

标签: php javascript

关于这一行:

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

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

以后的数据将通过ajax POST发送。

我了解网址,尤其是您在浏览器地址栏中可以看到的网址,需要使用此处所述的特殊字符:

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

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

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

4 个答案:

答案 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&param2=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的例子

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

答案 3 :(得分:0)

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

您可以使用AJAX

发送未编码的纯JSON
var ajaxObject = $.ajax({
    url: 'url',
    type: 'POST',
    data: JSON.stringify(object_literal);
});