Выразительный JavaScript (Хавербеке) - страница 186

Отправка запроса

Чтобы отправить простой запрос, мы создаём объект запроса с конструктором 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 становятся доступными сразу. Но это значит, что программа наша будет ожидать, пока браузер и сервер общаются меж собой. При плохой связи, слабом сервере или большом файле это может занять длительное время. Это плохо ещё и потому, что никакие обработчики событий не сработают, пока программа находится в режиме ожидания – документ перестанет реагировать на действия пользователя.