Чтобы отправить простой запрос, мы создаём объект запроса с конструктором XMLHttpRequest и вызываем методы open и send.
>var req = new XMLHttpRequest();
>req.open("GET", "example/data.txt", false);
>req.send(null);
>console.log(req.responseText);
>// → This is the content of data.txt
Метод >open
настраивает запрос. В нашем случае мы решили сделать >GET
запрос на файл example/data.txt. URL, не начинающиеся с названия протокола (например, http:) называются относительными, то есть они интерпретируются относительно текущего документа. Когда они начинаются со слэша (>/
), они заменяют текущий путь – часть после названия сервера. В ином случае часть текущего пути вплоть до последнего слэша помещается перед относительным URL.
После открытия запроса мы можем отправить его методом >send
. Аргументом служит тело запроса. Для запросов >GET
используется >null
. Если третий аргумент для >open
был >false
, то >send
вернётся только после того, как был получен ответ на наш запрос. Для получения тела ответа мы можем прочесть свойство >responseText
объекта >request
.
Можно получить из объекта >response
и другую информацию. Код статуса доступен в свойстве >status
, а текст статуса – в >statusText
. Заголовки можно прочесть из >getResponseHeader
.
>var req = new XMLHttpRequest();
>req.open("GET", "example/data.txt", false);
>req.send(null);
>console.log(req.status, req.statusText);
>// → 200 OK
>console.log(req.getResponseHeader("content-type"));
>// → text/plain
Названия заголовков не чувствительны к регистру. Они обычно пишутся с заглавной буквы в начале каждого слова, например “Content-Type”, но “content-type” или “cOnTeNt-TyPe” будут описывать один и тот же заголовок.
Браузер сам добавит некоторые заголовки, такие, как “Host” и другие, которые нужны серверу, чтобы вычислить размер тела. Но вы можете добавлять свои собственные заголовки методом >setRequestHeader
. Это нужно для особых случаев и требует содействия сервера, к которому вы обращаетесь – он волен игнорировать заголовки, которые он не умеет обрабатывать.
В примере запрос был окончен, когда заканчивается вызов >send
. Это удобно потому, что свойства вроде >responseText
становятся доступными сразу. Но это значит, что программа наша будет ожидать, пока браузер и сервер общаются меж собой. При плохой связи, слабом сервере или большом файле это может занять длительное время. Это плохо ещё и потому, что никакие обработчики событий не сработают, пока программа находится в режиме ожидания – документ перестанет реагировать на действия пользователя.