Page 146 - 6108
P. 146
xhr.send ();
Браузер автоматично додасть до запиту найважливіші HTTP-заголовки,
такі як Content-Length і Connection.
Запит, надісланий кодом вище через XMLHttpRequest, ніяк не
відрізняється від звичайної відправки форми. Сервер не в змозі їх відрізнити,
але можна вказати спеціальний заголовок
xhr.setRequestHeader ( "X-Requested-With", "XMLHttpRequest");
Метод POST
У стандартних HTTP-формах для методу POST доступні три кодування,
що задаються через атрибут enctype:
application/x-www-form-urlencoded (за умовчанням);
text-plain
multipart/form-data
Залежно від enctype браузер кодує дані відповідним способом перед
відправкою на сервер. У випадку з XMLHttpRequest ми, взагалі кажучи, не
зобов'язані використовувати жоден з цих способів. Головне, щоб сервер наш
запит зрозумів. Але зазвичай найпростіше вибрати якийсь із стандартних.
Зокрема, при POST обов'язковий заголовок Content-Type, що містить
кодування. Це вказівка для сервера - як обробляти (розкодувати) прийшов
запит.
let xhr = new XMLHttpRequest();
let body = 'name=' + encodeURIComponent(name) +
'&surname=' + encodeURIComponent(surname);
xhr.open("POST", '/submit');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-
urlencoded');
xhr.send(body);
У кодуванні multipart/form-data поля пересилаються одне за одним,
через рядок-роздільник. При цьому значення не кодуються, а щоб було чітко
зрозуміло, яке значення де - поля розділені випадково згенерованим рядком,
який називають «boundary» (англ. межа), який вказується у відповідному
заголовку. Формат відправлення буде наступним:
Content-Type: multipart/form-data; boundary=aBoundaryString
--aBoundaryString
Content-Disposition: form-data; name="myFile";
filename="img.jpg"
Content-Type: image/jpeg
(data)
--aBoundaryString
Content-Disposition: form-data; name="myField"
(data)
--aBoundaryString
(more subparts)
--aBoundaryString--