[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: multipart/form-data и application/x-www-form...
Forever
Сейчас читаю https://learn.javascript.ru/xhr-forms, и там пишут следующее:

"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?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.