我需要通过POST方法发送数据。
例如,我有字符串“bla& bla& bla”。我尝试使用encodeURI
并将“bla& bla& bla”作为结果。我需要更换“&”对于这个例子,有正确的东西。
我应该使用哪种方法来准备正确的POST数据?
更新:
我只需转换可能破坏POST请求的字符。只有他们。
答案 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 + "¶m2=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()不会编码:~!@#$&*()=:/,;?+'
在以下链接中已经很好地解释了这一点:
答案 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
那么......? 在这种情况下,您应该更多地了解如何编码和加入。