使用AJAX jquery时奇怪的“urlencoded”和“multipart/form-data”内容

strange "urlencoded" and "multipart/form-data" content when using ajax jquery

本文关键字:multipart form-data 内容 AJAX urlencoded 使用 jquery      更新时间:2023-09-26

我有以下jQuery脚本:

<script>
$( document ).ready(function() {
var mydata = "öäüöäü";
$.ajax({
    url : "http://localhost:10000",
    type: "POST",
    data : mydata,
    success: function(data, textStatus, jqXHR) {},
    error: function (jqXHR, textStatus, errorThrown) {}
    })
});
</script>

我正在尝试使用 Python 解析请求,如果我运行上面的代码,我在网络上看到的是:

POST / HTTP/1.1'r'n
Host: localhost:10000'r'n
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0'r'n
Accept: */*'r'n
Accept-Language: en-US,en;q=0.5'r'n
Accept-Encoding: gzip, deflate'r'n
Content-Type: application/x-www-form-urlencoded; charset=UTF-8'r'n
Referer: http://localhost/index_ajax.html'r'n
Content-Length: 12'r'n
Origin: http://localhost'r'n
Connection: keep-alive'r'n
Pragma: no-cache'r'n
Cache-Control: no-cache'r'n
'r'n
'xc3'xb6'xc3'xa4'xc3'xbc'xc3'xb6'xc3'xa4'xc3'xbc

内容类型是"x-www-form-urlencoded",但所有数据似乎都是字节编码的而不是为此内容类型定义的百分比编码。

将 ajax 代码从:

data : mydata,

{'mydata': data}

生成相同的标头和正确的正文内容:

mydata=%C3%B6%C3%A4%C3%BC%C3%B6%C3%A4%C3%BC

内容现在按预期进行了百分比编码。

如果我向 ajax 代码添加另一种内容类型,则会产生相同的正文:

contentType:"multipart/form-data"

现在我看到"内容类型:多部分/表单数据;字符集=UTF-8"在标题中,但正文本身与多部分/表单数据不同。

为什么jQuery允许向服务器发送不符合要求的数据?如何将正确的数据发送到服务器?

您看到的内容类型标头是要发送的默认标头。当您将data设置为字符串时,jQuery假设您自己已经处理了编码,对于要进行的任何转换(例如表单URL编码),您必须发送一个对象。

请参阅jQuery.ajax()文档:

内容类型(默认值:'application/x-www-form-urlencoded; charset=UTF-8'

数据
类型:PlainObjectStringArray
要发送到服务器的数据。如果还不是字符串,则会将其转换为查询字符串。

强调我的。

如果 jQuery 转换了字符串,您将永远无法发送不应进行 URL 编码的有效内容类型(如 JSON 或 XML 帖子正文),也无法发布已通过其他方式进行 URL 编码的数据。

要自行手动编码数据,请使用encodeURIComponent()函数:

$.ajax({
    url : "http://localhost:10000",
    type: "POST",
    data : encodeURIComponent(mydata),
    success: function(data, textStatus, jqXHR) {},
    error: function (jqXHR, textStatus, errorThrown) {}
    })
});