如何在javascript上准备编码的POST数据?

时间:2013-02-12 10:32:33

标签: javascript encoding

我需要通过POST方法发送数据。

例如,我有字符串“bla& bla& bla”。我尝试使用encodeURI并将“bla& bla& bla”作为结果。我需要更换“&”对于这个例子,有正确的东西。

我应该使用哪种方法来准备正确的POST数据?

更新:

我只需转换可能破坏POST请求的字符。只有他们。

5 个答案:

答案 0 :(得分:20)

>>> encodeURI("bla&bla&bla")

"bla&bla&bla"

>>> encodeURIComponent("bla&bla&bla")

"bla%26bla%26bla"

答案 1 :(得分:13)

您还可以使用escape()函数。escape()函数对字符串进行编码。 此函数使字符串可移植,因此可以通过任何网络传输到任何支持ASCII字符的计算机。此函数对特殊字符进行编码,但:* @ - _ + . /

除外
var queryStr = "bla&bla&bla";
alert(queryStr);               //bla&bla&bla
alert(escape(queryStr));       //bla%26bla%26bla

使用unescape()解码字符串。

var newQueryStr=escape(queryStr);
alert(unescape(newQueryStr));   //bla&bla&bla

注意:

    escape() will not encode: @*/+

    encodeURI() will not encode: ~!@#$&*()=:/,;?+'

    encodeURIComponent() will not encode: ~!*()'

在互联网上进行一些搜索后,我得到了以下信息:

<强>逃逸()

不要使用它。

<强>是encodeURI()

如果需要工作网址,请使用encodeURI。拨打这个电话:

encodeURI("http://www.google.com/a file with spaces.html")

得到:

http://www.google.com/a%20file%20with%20spaces.html

不要调用encodeURIComponent,因为它会破坏URL并返回

http%3A%2F%2Fwww.google.com%2Fa%20file%20with%20spaces.html

<强> encodeURIComponent方法()

如果要对URL参数进行编码,请使用encodeURIComponent。

param1 = encodeURIComponent(“http://xyz.com/?a=12&b=55”)

Then you may create the URL you need:

url = "http://domain.com/?param1=" + param1 + "&param2=99";

您将获得完整的网址:

http://www.domain.com/?param1=http%3A%2F%2Fxyz.com%2F%Ffa%3D12%26b%3D55¶m2=99

请注意encodeURIComponent不会转义'字符。一个常见的错误是使用它来创建html属性,例如href='MyUrl',,这可能会遭受注入错误。如果要从字符串构造html,可以使用“而不是”作为属性引号,或者添加额外的编码层('可以编码为%27)。

REF:When are you supposed to use escape instead of encodeURI / encodeURIComponent?

此外,正如您使用的是JQuery ,请查看this内置函数。

答案 2 :(得分:6)

使用encodeURIComponent()作为encodeURI()不会编码:~!@#$&*()=:/,;?+'

在以下链接中已经很好地解释了这一点:

http://xkr.us/articles/javascript/encode-compare/

答案 3 :(得分:0)

在某些情况下,用于URLSearchParams的最新DOM API(以及通过URL,可能还有其他)也处理编码。例如,创建或使用现有的URL对象(例如来自定位标记),将对象的条目映射为URL编码参数的键值对(用于application / x-www-form-urlencoded中的GET / POST / etc)模仿型)。请注意如何对表情符号,&符号和双引号进行编码而无需任何特殊处理(从Chrome devtools控制台复制):

var url = new URL(location.pathname, location.origin);
    Object.entries({a:1,b:"",c:'"stuff&things"'}).forEach(url.searchParams.set, url.searchParams);
    url.search;
    "?a=1&b=%F0%9F%8D%BB&c=%22stuff%26things%22"

fetch(url.pathname, {
    method: 'POST',
    headers: new Headers({
        "Content-type": "application/x-www-form-urlencoded"
    }),
    // same format as GET url search params a&b&c
    body: url.searchParams
}).then((res)=>{ console.log(res); return res }).catch((res)=>{ console.warn(res); return res; });

答案 4 :(得分:-1)

我希望POST javascript创建的隐藏表单。

所以问题是是否应该在每个POST变量上使用 encodeURIComponent()

我还没有在这个帖子中找到德米特里(和我)问题的答案。 但我找到了答案in this thread

如果您有上传字段的表单/ POST,则必须使用<form enctype="multipart/form-data">,如果未使用上传字段,则应选择自己为described here。 提交表单应该完成工作,因此不需要明确使用encodeURIComponent()

如果您在不使用表单的情况下创建Http POST或没有从您的数据创建Http POST的库,那么您需要选择一个enctype =并自己加入数据。

这对于application/x-www-form-urlencoded来说很容易,您将在每个值上使用encodeURIComponent(),并将其与GET请求完全相同。

如果您决定使用multipart/form-data那么......? 在这种情况下,您应该更多地了解如何编码和加入