奇怪的" urlencoded"和" multipart / form-data"使用ajax jquery时的内容

时间:2015-01-02 22:00:17

标签: javascript jquery python ajax forms

我有以下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

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

更改ajax代码:

data : mydata,

{'mydata': data}

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

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

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

如果我向ajax代码添加另一个内容类型,则会生成相同的主体:

contentType:"multipart/form-data"

现在我看到&#34; Content-Type:multipart / form-data;字符集= UTF-8&#34;在标题中,但身体本身 对于multipart / form-data而言,并不像预期的那样。

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

1 个答案:

答案 0 :(得分:1)

您看到的Content-Type标头是要发送的默认标头。当您将data设置为字符串时,jQuery会假设您已自行处理编码,以便进行任何转换(例如表单URL编码) em>发送一个对象。

请参阅jQuery.ajax() documentation

  

contentType (默认:'application/x-www-form-urlencoded; charset=UTF-8'

  

数据
  输入:PlainObjectStringArray
  要发送到服务器的数据。 如果不是字符串,则转换为查询字符串。

强调我的。

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

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

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