使用AJAX jquery时奇怪的“urlencoded”和“multipart/form-data”内容
strange "urlencoded" and "multipart/form-data" content when using ajax jquery
我有以下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'
)
和
数据
类型:PlainObject
或String
或Array
要发送到服务器的数据。如果还不是字符串,则会将其转换为查询字符串。
强调我的。
如果 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) {}
})
});
相关文章:
- ExtJS使用控制器中的View Form Data作为Ajax请求参数
- 使用AJAX jquery时奇怪的“urlencoded”和“multipart/form-data”内容
- XMLHttpRequest multipart/form数据:multipart中的边界无效
- nodejsPOST请求multipart/form数据,如何更改name属性
- 如何用ajax发送multipart/form数据请求
- jquery Form - Data
- 为什么我需要包含enctype="multipart/form-data"当通过表单发送数据时,但通
- Angular multipart/form-data表单发送
- 如何在multipart/form-data - Angular中获取或设置边界
- 文件上传使用base64编码的文本而不是multipart/form-data -好主意
- Node.js multipart/form-data本地文件上传到api
- 如何从表单中提交“multipart/form-data”并让你的函数被调用
- 在Node.js中解析Buffer中的multipart/form-data
- 尝试用node.js supertest发布multipart/form-data
- 使用symfony2从post Multipart (Content-Disposition: form-data)中获
- 我可以使用enctype='multipart/form-data'POST非文件输入
- Javascript有一个图像作为URI数据,我如何通过multipart/form-data表单上传这个图像
- Javascript Facebook API POST multipart/form-data
- 如何将文件发送到multipart/form-data
- XMLHttpRequest POST multipart/form-data