Ðо вÑÐµÐ¼Ñ Ð¾Ð±ÑÑной оÑпÑавки ÑоÑÐ¼Ñ <form> бÑаÑÐ·ÐµÑ ÑобиÑÐ°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐµÑ Ð¿Ð¾Ð»ÐµÐ¹, Ð´ÐµÐ»Ð°ÐµÑ Ð¸Ð· ниÑ
ÑÑÑÐ¾ÐºÑ Ð¸ ÑоÑÑавлÑÐµÑ Ñело GET/POST-запÑоÑа Ð´Ð»Ñ Ð¿Ð¾ÑÑлки на ÑеÑвеÑ.
ÐÑи оÑпÑавке даннÑÑ
ÑеÑез XMLHttpRequest, ÑÑо нÑжно делаÑÑ Ñамим, в JS-коде. ÐолÑÑинÑÑво пÑоблем и вопÑоÑов здеÑÑ ÑвÑзано Ñ Ð½ÐµÐ¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸ÐµÐ¼, где и какое кодиÑование нÑжно оÑÑÑеÑÑвлÑÑÑ.
ÐодиÑовка urlencoded
ÐÑновной ÑпоÑоб кодиÑовки запÑоÑов â ÑÑо urlencoded, Ñо еÑÑÑ â ÑÑандаÑÑное кодиÑование URL.
ÐапÑимеÑ, ÑоÑма:
<form action="/submit" method="GET">
<input name="name" value="Ivan">
<input name="surname" value="Ivanov">
</form>
ÐдеÑÑ ÐµÑÑÑ Ð´Ð²Ð° полÑ: name=Ivan и surname=Ivanov.
ÐÑаÑÐ·ÐµÑ Ð¿ÐµÑеÑиÑлÑÐµÑ Ñакие паÑÑ Â«Ð¸Ð¼Ñ=знаÑение» ÑеÑез Ñимвол ампеÑÑанда & и, Ñак как меÑод GET, иÑоговÑй запÑÐ¾Ñ Ð²ÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº /submit?name=Ivan&surname=Ivanov.
ÐÑе ÑимволÑ, кÑоме английÑкиÑ
бÑкв, ÑиÑÑ Ð¸ - _ . ! ~ * ' ( ) заменÑÑÑÑÑ Ð½Ð° иÑ
ÑиÑÑовой код в UTF-8 Ñо знаком %.
ÐапÑимеÑ, пÑобел заменÑеÑÑÑ Ð½Ð° %20, Ñимвол / на %2F, ÑÑÑÑкие бÑÐºÐ²Ñ ÐºÐ¾Ð´Ð¸ÑÑÑÑÑÑ Ð´Ð²ÑÐ¼Ñ Ð±Ð°Ð¹Ñами в UTF-8, поÑÑомÑ, к пÑимеÑÑ, Ц замениÑÑÑ Ð½Ð° %D0%A6.
ÐапÑимеÑ, ÑоÑма:
<form action="/submit" method="GET">
<input name="name" value="ÐикÑоÑ">
<input name="surname" value="Цой">
</form>
ÐÑÐ´ÐµÑ Ð¾ÑпÑавлена Ñак: /submit?name=%D0%92%D0%B8%D0%BA%D1%82%D0%BE%D1%80&surname=%D0%A6%D0%BE%D0%B9.
в JavaScript еÑÑÑ ÑÑнкÑÐ¸Ñ encodeURIComponent Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ñакой кодиÑовки «вÑÑÑнÑÑ»:
alert( encodeURIComponent(' ') ); // %20
alert( encodeURIComponent('/') ); // %2F
alert( encodeURIComponent('Ð') ); // %D0%92
alert( encodeURIComponent('ÐикÑоÑ') ); // %D0%92%D0%B8%D0%BA%D1%82%D0%BE%D1%80
ÐÑа кодиÑовка иÑполÑзÑеÑÑÑ Ð² оÑновном Ð´Ð»Ñ Ð¼ÐµÑода GET, Ñо еÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑедаÑи паÑамеÑÑа в ÑÑÑоке запÑоÑа. Ðо ÑÑандаÑÑÑ ÑÑÑока запÑоÑа не Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¿ÑоизволÑнÑе Unicode-ÑимволÑ, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ кодиÑÑÑÑÑÑ ÐºÐ°Ðº показано вÑÑе.
GET-запÑоÑ
ФоÑмиÑÑÑ XMLHttpRequest, Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоÑмиÑоваÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Â«ÑÑками», кодиÑÑÑ Ð¿Ð¾Ð»Ñ ÑÑнкÑией encodeURIComponent.
ÐапÑимеÑ, Ð´Ð»Ñ Ð¿Ð¾ÑÑлки GET-запÑоÑа Ñ Ð¿Ð°ÑамеÑÑами name и surname, аналогиÑно ÑоÑме вÑÑе, иÑ
необÑ
одимо закодиÑоваÑÑ Ñак:
// ÐеÑедаÑм name и surname в паÑамеÑÑаÑ
запÑоÑа
var xhr = new XMLHttpRequest();
var params = 'name=' + encodeURIComponent(name) +
'&surname=' + encodeURIComponent(surname);
xhr.open("GET", '/submit?' + params, true);
xhr.onreadystatechange = ...;
xhr.send();
ÐÑаÑÐ·ÐµÑ Ð°Ð²ÑомаÑиÑеÑки Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ Ðº запÑоÑÑ Ð²Ð°Ð¶Ð½ÐµÐ¹Ñие HTTP-заголовки, Ñакие как Content-Length и Connection.
Ðо ÑпеÑиÑикаÑии бÑаÑÐ·ÐµÑ Ð·Ð°Ð¿ÑеÑÐ°ÐµÑ Ð¸Ñ
ÑвнÑÑ ÑÑÑановкÑ, как и некоÑоÑÑÑ
дÑÑгиÑ
низкоÑÑовневÑÑ
HTTP-заголовков, коÑоÑÑе могли Ð±Ñ Ð²Ð²ÐµÑÑи в заблÑждение ÑеÑÐ²ÐµÑ Ð¾ÑноÑиÑелÑно Ñого, кÑо и ÑколÑко даннÑÑ
ÐµÐ¼Ñ Ð¿ÑиÑлал, напÑÐ¸Ð¼ÐµÑ Referer. ÐÑо Ñделано в ÑелÑÑ
конÑÑÐ¾Ð»Ñ Ð¿ÑавилÑноÑÑи запÑоÑа и Ð´Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи.
ÐапÑоÑ, оÑпÑавленнÑй кодом вÑÑе ÑеÑез XMLHttpRequest, никак не оÑлиÑаеÑÑÑ Ð¾Ñ Ð¾Ð±ÑÑной оÑпÑавки ÑоÑмÑ. СеÑÐ²ÐµÑ Ð½Ðµ в ÑоÑÑоÑнии иÑ
оÑлиÑиÑÑ.
ÐоÑÑÐ¾Ð¼Ñ Ð² некоÑоÑÑÑ ÑÑеймвоÑÐºÐ°Ñ , ÑÑÐ¾Ð±Ñ ÑказаÑÑ ÑеÑвеÑÑ, ÑÑо ÑÑо AJAX, добавлÑÑÑ ÑпеÑиалÑнÑй заголовок, напÑÐ¸Ð¼ÐµÑ Ñакой:
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
POST Ñ urlencoded
РмеÑоде POST паÑамеÑÑÑ Ð¿ÐµÑедаÑÑÑÑ Ð½Ðµ в URL, а в Ñеле запÑоÑа. Ðно ÑказÑваеÑÑÑ Ð² вÑзове send(body).
Ð ÑÑандаÑÑнÑÑ
HTTP-ÑоÑмаÑ
Ð´Ð»Ñ Ð¼ÐµÑода POST доÑÑÑÐ¿Ð½Ñ ÑÑи кодиÑовки, задаваемÑе ÑеÑез аÑÑибÑÑ enctype:
application/x-www-form-urlencodedmultipart/form-datatext/plain
РзавиÑимоÑÑи Ð¾Ñ enctype бÑаÑÐ·ÐµÑ ÐºÐ¾Ð´Ð¸ÑÑÐµÑ Ð´Ð°Ð½Ð½Ñе ÑооÑвеÑÑÑвÑÑÑим ÑпоÑобом пеÑед оÑпÑавкой на ÑеÑвеÑ.
Ð ÑлÑÑае Ñ XMLHttpRequest мÑ, вообÑе говоÑÑ, не обÑÐ·Ð°Ð½Ñ Ð¸ÑполÑзоваÑÑ Ð½Ð¸ один из ÑÑиÑ
ÑпоÑобов. Ðлавное, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ Ð½Ð°Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¿Ð¾Ð½Ñл. Ðо обÑÑно пÑоÑе вÑего вÑбÑаÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо из ÑÑандаÑÑнÑÑ
.
Ð ÑаÑÑноÑÑи, пÑи POST обÑзаÑелен заголовок Content-Type, ÑодеÑжаÑий кодиÑовкÑ. ÐÑо Ñказание Ð´Ð»Ñ ÑеÑвеÑа â как обÑабаÑÑваÑÑ (ÑаÑкодиÑоваÑÑ) пÑиÑедÑий запÑоÑ.
ÐÐ»Ñ Ð¿ÑимеÑа оÑпÑавим запÑÐ¾Ñ Ð² кодиÑовке application/x-www-form-urlencoded:
var xhr = new XMLHttpRequest();
var body = 'name=' + encodeURIComponent(name) +
'&surname=' + encodeURIComponent(surname);
xhr.open("POST", '/submit', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = ...;
xhr.send(body);
ÐÑегда иÑполÑзÑеÑÑÑ ÑолÑко кодиÑовка UTF-8, незавиÑимо Ð¾Ñ ÑзÑка и кодиÑовки ÑÑÑаниÑÑ.
ÐÑли ÑеÑÐ²ÐµÑ Ð²Ð´ÑÑг Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе в дÑÑгой кодиÑовке, к пÑимеÑÑ windows-1251, Ñо Ð¸Ñ Ð½Ñжно бÑÐ´ÐµÑ Ð¿ÐµÑекодиÑоваÑÑ.
ÐодиÑовка multipart/form-data
ÐодиÑовка urlencoded за ÑÑÑÑ Ð·Ð°Ð¼ÐµÐ½Ñ Ñимволов на %код Ð¼Ð¾Ð¶ÐµÑ ÑилÑно «ÑаздÑÑÑ» обÑий обÑÑм пеÑеÑÑлаемÑÑ
даннÑÑ
. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð¿ÐµÑеÑÑлки Ñайлов иÑполÑзÑеÑÑÑ Ð´ÑÑÐ³Ð°Ñ ÐºÐ¾Ð´Ð¸Ñовка: multipart/form-data.
Ð ÑÑой кодиÑовке Ð¿Ð¾Ð»Ñ Ð¿ÐµÑеÑÑлаÑÑÑÑ Ð¾Ð´Ð½Ð¾ за дÑÑгим, ÑеÑез ÑÑÑокÑ-ÑазделиÑелÑ.
ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÑÑÐ¾Ñ ÑпоÑоб, нÑжно ÑказаÑÑ ÐµÐ³Ð¾ в аÑÑибÑÑе enctype и меÑод должен бÑÑÑ POST:
<form action="/submit" method="POST" enctype="multipart/form-data">
<input name="name" value="ÐикÑоÑ">
<input name="surname" value="Цой">
</form>
ФоÑма пÑи Ñакой кодиÑовке бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ð¿ÑимеÑно Ñак:
...Ðаголовки...
Content-Type: multipart/form-data; boundary=RaNdOmDeLiMiTeR
--RaNdOmDeLiMiTeR
Content-Disposition: form-data; name="name"
ÐикÑоÑ
--RaNdOmDeLiMiTeR
Content-Disposition: form-data; name="surname"
Цой
--RaNdOmDeLiMiTeR--
â¦Ð¢Ð¾ еÑÑÑ, Ð¿Ð¾Ð»Ñ Ð¿ÐµÑедаÑÑÑÑ Ð¾Ð´Ð½Ð¾ за дÑÑгим, знаÑÐµÐ½Ð¸Ñ Ð½Ðµ кодиÑÑÑÑÑÑ, а ÑÑÐ¾Ð±Ñ Ð±Ñло ÑÑÑко понÑÑно, какое знаÑение где â Ð¿Ð¾Ð»Ñ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ñ ÑлÑÑайно ÑгенеÑиÑованной ÑÑÑокой, коÑоÑÑÑ Ð½Ð°Ð·ÑваÑÑ Â«boundary» (англ. гÑаниÑа), в пÑимеÑе вÑÑе ÑÑо RaNdOmDeLiMiTeR:
СеÑÐ²ÐµÑ Ð²Ð¸Ð´Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Content-Type: multipart/form-data, ÑиÑÐ°ÐµÑ Ð¸Ð· него гÑаниÑÑ Ð¸ ÑаÑкодиÑÑÐµÑ Ð¿Ð¾Ð»Ñ ÑоÑмÑ.
Такой ÑпоÑоб иÑполÑзÑеÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¿Ñи пеÑеÑÑлке Ñайлов, Ñак пеÑекодиÑовка мегабайÑов ÑеÑез urlencoded ÑÑÑеÑÑвенно загÑÑзила Ð±Ñ Ð±ÑаÑзеÑ. Ðа и обÑÑм даннÑÑ Ð¿Ð¾Ñле Ð½ÐµÑ ÑилÑно вÑÑÐ¾Ñ Ð±Ñ.
Ðднако, никÑо не меÑÐ°ÐµÑ Ð¸ÑполÑзоваÑÑ ÑÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ Ð²Ñегда Ð´Ð»Ñ POST запÑоÑов. ÐÐ»Ñ GET доÑÑÑпна ÑолÑко urlencoded.
POST Ñ multipart/form-data
СделаÑÑ 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);
Тело запÑоÑа бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð²Ð¸Ð´, опиÑаннÑй вÑÑе, Ñо еÑÑÑ Ð¿Ð¾Ð»Ñ ÑеÑез ÑазделиÑелÑ.
Ðожно ÑоздаÑÑ Ð·Ð°Ð¿ÑоÑ, коÑоÑÑй ÑеÑÐ²ÐµÑ Ð²Ð¾ÑпÑÐ¸Ð¼ÐµÑ ÐºÐ°Ðº загÑÑÐ·ÐºÑ Ñайла.
ÐÐ»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñайла нÑжно иÑполÑзоваÑÑ ÑÐ¾Ñ Ð¶Ðµ код, ÑÑо вÑÑе, модиÑиÑиÑовав заголовки пеÑед полем, коÑоÑое ÑвлÑеÑÑÑ Ñайлом, Ñак:
Content-Disposition: form-data; name="myfile"; filename="pic.jpg"
Content-Type: image/jpeg
(пÑÑÑÐ°Ñ ÑÑÑока)
ÑодеÑжимое Ñайла
FormData
СовÑеменнÑе бÑаÑзеÑÑ, иÑклÑÑÐ°Ñ IE9- (впÑоÑем, еÑÑÑ Ð¿Ð¾Ð»Ð¸Ñил), поддеÑживаÑÑ Ð²ÑÑÑоеннÑй обÑÐµÐºÑ FormData, коÑоÑÑй кодиÑÑÐµÑ ÑоÑÐ¼Ñ Ð´Ð»Ñ Ð¾ÑпÑавки на ÑеÑвеÑ.
ÐÑо оÑÐµÐ½Ñ Ñдобно. ÐапÑимеÑ:
<form name="person">
<input name="name" value="ÐикÑоÑ">
<input name="surname" value="Цой">
</form>
<script>
// ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ Ð´Ð»Ñ ÑоÑмÑ
var formData = new FormData(document.forms.person);
// добавиÑÑ Ðº пеÑеÑÑлке еÑÑ Ð¿Ð°ÑÑ ÐºÐ»ÑÑ - знаÑение
formData.append("patronym", "РобеÑÑовиÑ");
// оÑоÑлаÑÑ
var xhr = new XMLHttpRequest();
xhr.open("POST", "/url");
xhr.send(formData);
</script>
ÐÑÐ¾Ñ ÐºÐ¾Ð´ оÑпÑÐ°Ð²Ð¸Ñ Ð½Ð° ÑеÑÐ²ÐµÑ ÑоÑÐ¼Ñ Ñ Ð¿Ð¾Ð»Ñми name, surname и patronym.
ÐнÑеÑÑейÑ:
- ÐонÑÑÑÑкÑоÑ
new FormData([form])вÑзÑваеÑÑÑ Ð»Ð¸Ð±Ð¾ без аÑгÑменÑов, либо Ñ DOM-ÑлеменÑом ÑоÑмÑ. - ÐеÑод
formData.append(name, value)добавлÑÐµÑ Ð´Ð°Ð½Ð½Ñе к ÑоÑме.
ÐбÑÐµÐºÑ formData можно ÑÑÐ°Ð·Ñ Ð¾ÑÑÑлаÑÑ, инÑегÑаÑÐ¸Ñ FormData Ñ XMLHttpRequest вÑÑÑоена в бÑаÑзеÑ. ÐодиÑовка пÑи ÑÑом бÑÐ´ÐµÑ multipart/form-data.
ÐÑÑгие кодиÑовки
XMLHttpRequest Ñам по Ñебе не огÑаниÑÐ¸Ð²Ð°ÐµÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ Ð¸ ÑоÑÐ¼Ð°Ñ Ð¿ÐµÑеÑÑлаемÑÑ Ð´Ð°Ð½Ð½ÑÑ .
ÐоÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° даннÑми ÑаÑÑо иÑполÑзÑеÑÑÑ ÑоÑÐ¼Ð°Ñ JSON:
var xhr = new XMLHttpRequest();
var json = JSON.stringify({
name: "ÐикÑоÑ",
surname: "Цой"
});
xhr.open("POST", '/submit', true)
xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
xhr.onreadystatechange = ...;
// ÐÑÑÑлаем обÑÐµÐºÑ Ð² ÑоÑмаÑе JSON и Ñ Content-Type application/json
// СеÑÐ²ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑмеÑÑ Ñакой Content-Type пÑинимаÑÑ Ð¸ ÑаÑкодиÑоваÑÑ
xhr.send(json);
ÐÑого
- У ÑоÑм еÑÑÑ Ð´Ð²Ðµ оÑновнÑе кодиÑовки:
application/x-www-form-urlencodedâ по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸multipart/form-dataâ Ð´Ð»Ñ POST запÑоÑов, еÑли Ñвно Ñказана вenctype. ÐÑоÑÐ°Ñ ÐºÐ¾Ð´Ð¸Ñовка обÑÑно иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ ÑолÑко Ð´Ð»Ñ Ñела запÑоÑа. - ÐÐ»Ñ ÑоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа в
application/x-www-form-urlencodedиÑполÑзÑеÑÑÑ ÑÑнкÑиÑencodeURIComponent. - ÐÐ»Ñ Ð¾ÑпÑавки запÑоÑа в
multipart/form-dataâ обÑекÑFormData. - ÐÐ»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° даннÑми JS â ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð¸ пÑоÑÑо JSON, желаÑелÑно Ñ Ñказанием кодиÑовки в заголовке
Content-Type.
Ð XMLHttpRequest можно иÑполÑзоваÑÑ Ð¸ дÑÑгие HTTP-меÑодÑ, напÑÐ¸Ð¼ÐµÑ PUT, DELETE, TRACE. Рним пÑÐ¸Ð¼ÐµÐ½Ð¸Ð¼Ñ Ð²Ñе Ñе же пÑинÑипÑ, ÑÑо опиÑÐ°Ð½Ñ Ð²ÑÑе.

ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)