使用 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
Content-Type 是 "x-www-form-urlencoded" 但所有数据似乎都是 byte-encoded
而不是为此内容类型定义的编码百分比。
更改 ajax 代码来自:
data : mydata,
到
{'mydata': data}
产生相同的 headers 和正确的 body 内容:
mydata=%C3%B6%C3%A4%C3%BC%C3%B6%C3%A4%C3%BC
现在的内容符合预期 percent-encoded。
如果我在 ajax 代码中添加另一个 content-type:
,则会生成相同的 body
contentType:"multipart/form-data"
现在我在 headers 中看到了 "Content-Type: multipart/form-data; charset=UTF-8",但是 body 本身
与 multipart/form-data.
的预期不同
为什么jQuery允许向服务器发送non-conform数据?如何向服务器发送正确的数据?
您看到的Content-Typeheader是默认要发送的header。当您将 data
设置为 字符串 时,jQuery 假定您已自行处理编码,以便进行任何转换(例如 [=52 形式) =] 编码)你 有 发送 object.
参见 jQuery.ajax()
documentation:
contentType (default: 'application/x-www-form-urlencoded; charset=UTF-8'
)
和
data
Type: PlainObject
or String
or Array
Data to be sent to the server. It is converted to a query string, if not already a string.
强调我的。
如果 jQuery 转换字符串,您将永远无法发送有效的内容类型 而不是 URL-encoded,例如 [=48] =] 或 XML post body,您也不能 post 通过其他方式已经 URL-encoded 的数据。
要自己手动编码数据,请使用 encodeURIComponent()
function:
$.ajax({
url : "http://localhost:10000",
type: "POST",
data : encodeURIComponent(mydata),
success: function(data, textStatus, jqXHR) {},
error: function (jqXHR, textStatus, errorThrown) {}
})
});
我有以下 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
Content-Type 是 "x-www-form-urlencoded" 但所有数据似乎都是 byte-encoded 而不是为此内容类型定义的编码百分比。
更改 ajax 代码来自:
data : mydata,
到
{'mydata': data}
产生相同的 headers 和正确的 body 内容:
mydata=%C3%B6%C3%A4%C3%BC%C3%B6%C3%A4%C3%BC
现在的内容符合预期 percent-encoded。
如果我在 ajax 代码中添加另一个 content-type:
,则会生成相同的 bodycontentType:"multipart/form-data"
现在我在 headers 中看到了 "Content-Type: multipart/form-data; charset=UTF-8",但是 body 本身 与 multipart/form-data.
的预期不同为什么jQuery允许向服务器发送non-conform数据?如何向服务器发送正确的数据?
您看到的Content-Typeheader是默认要发送的header。当您将 data
设置为 字符串 时,jQuery 假定您已自行处理编码,以便进行任何转换(例如 [=52 形式) =] 编码)你 有 发送 object.
参见 jQuery.ajax()
documentation:
contentType (default:
'application/x-www-form-urlencoded; charset=UTF-8'
)
和
data
Type:PlainObject
orString
orArray
Data to be sent to the server. It is converted to a query string, if not already a string.
强调我的。
如果 jQuery 转换字符串,您将永远无法发送有效的内容类型 而不是 URL-encoded,例如 [=48] =] 或 XML post body,您也不能 post 通过其他方式已经 URL-encoded 的数据。
要自己手动编码数据,请使用 encodeURIComponent()
function:
$.ajax({
url : "http://localhost:10000",
type: "POST",
data : encodeURIComponent(mydata),
success: function(data, textStatus, jqXHR) {},
error: function (jqXHR, textStatus, errorThrown) {}
})
});