"multipart/form-data - такой способ используется в первую очередь при пересылке файлов, так перекодировка мегабайтов через urlencoded существенно загрузила бы браузер. Да и объём данных после неё сильно вырос бы.
Однако, никто не мешает использовать эту кодировку всегда для POST запросов. Для GET доступна только urlencoded.
Сделать POST-запрос в кодировке multipart/form-data можно и через XMLHttpRequest.
Достаточно указать в заголовке Content-Type кодировку и границу, и далее сформировать тело запроса, удовлетворяющее требованиям кодировки.
Пример кода для того же запроса, что и раньше, теперь в кодировке multipart/form-data:"
var data = {
name: 'Виктор',
surname: 'Цой'
};
var boundary = String(Math.random()).slice(2);
var boundaryMiddle = '--' + boundary + '\r\n';
var boundaryLast = '--' + boundary + '--\r\n'
var body = ['\r\n'];
for (var key in data) {
// добавление поля
body.push('Content-Disposition: form-data; name="' + key + '"\r\n\r\n' + data[key] + '\r\n');
}
body = body.join(boundaryMiddle) + boundaryLast;
// Тело запроса готово, отправляем
var xhr = new XMLHttpRequest();
xhr.open('POST', '/submit', true);
xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
xhr.onreadystatechange = function() {
if (this.readyState != 4) return;
alert( this.responseText );
}
xhr.send(body);
Так вот, я затестил этот метод, и он отправляет на сервер 183 байта (в PHP значение $_SERVER["content-length"] = 183).
Затем использовал обычный метод (application/x-www-form-urlencoded):
var name = 'Виктор';
var surname = 'Цой';
var xhr = new XMLHttpRequest();
var body = 'name=' + encodeURIComponent(name) + '&surname=' + encodeURIComponent(surname);
xhr.open("POST", 'server.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = ...;
xhr.send(body);
В результате $_SERVER["content-length"] = 32 байта. На сервер пришло почти в 6 раз меньше. Нагрузка на него тоже меньше, получается.
Значит, для посылки обычного текста лучше использовать application/x-www-form-urlencoded?