Как отправить http-запрос в браузере
Обновлено: 21.11.2024
Познакомьтесь с веб-запросами и Fetch API, чтобы упростить отправку и получение данных!
Для этого запроса сервер может вернуть следующее:
Это происходит много раз, и все это полностью поддерживается в JavaScript! Эта возможность асинхронно запрашивать и обрабатывать данные с сервера, не требуя навигации/перезагрузки страницы, имеет термин. Этот термин — Ajax (или AJAX, если хотите кричать). Эта аббревиатура означает асинхронный JavaScript и XML, и если несколько лет назад вы работали с веб-разработчиками, Ajax был модным словом, которое все использовали для описания того типа веб-приложений, которые мы считаем само собой разумеющимся сегодня — таких приложений, как Twitter, Facebook, Google Maps, Gmail и другие сервисы, которые постоянно извлекают данные по мере того, как вы взаимодействуете со страницей, не требуя полной перезагрузки страницы!
Пример
Не знаю, как вы, а я очень рад, что все это сошлось воедино. К тому времени, когда вы дойдете до конца этого руководства, вы тоже создадите что-то похожее на этот пример и узнаете все о том, что происходит под капотом, чтобы заставить его работать.
Познакомьтесь с Фетч
Погружение в код
Если вы хотите продолжить, создайте новый HTML-документ и добавьте в него следующую разметку:
Внутри тега script добавьте следующий код, составляющий наш веб-запрос:
Добавив эти строки, сохраните изменения и протестируйте свою страницу в браузере. Вы не увидите ничего отображаемого на экране, но если вы откроете консоль с помощью инструментов разработчика браузера, вы должны увидеть, как отображается ваш IP-адрес:
Это что-то! Теперь, когда наш IP-адрес отображается на нашей консоли, давайте уделим немного времени и вернемся к коду и посмотрим, что именно он делает. В нашей первой строке кода мы вызываем fetch и указываем URL-адрес, на который мы хотим отправить запрос:
URL-адрес, на который мы отправляем запрос, — ipinfo.io/json. Как только эта строка будет запущена, служба, работающая на ipinfo.io, отправит нам некоторые данные. Мы должны обрабатывать эти данные, и за эту обработку отвечают следующие два блока then:
Одна очень важная деталь, на которую стоит обратить внимание, это то, что ответ, возвращаемый fetch, является Promise . Эти блоки then являются частью того, как промисы работают асинхронно, что позволяет нам обрабатывать результаты. Рассмотрение промисов выходит за рамки этой статьи, но документация MDN отлично объясняет, что они из себя представляют. На данный момент нужно знать, что у нас есть цепочка блоков then, где каждый блок вызывается автоматически после завершения предыдущего. Поскольку все это асинхронно, все это делается, пока остальная часть нашего приложения делает свое дело. Нам не нужно делать ничего лишнего, чтобы код, связанный с запросом, не блокировал и не зависал в нашем приложении в ожидании медленного результата в сети или при обработке большого объема данных.
Возвращаясь к нашему коду, в нашем первом блоке then мы указываем, что нам нужны необработанные данные JSON, которые возвращает наш вызов fetch:
В следующем блоке then, который вызывается после завершения предыдущего, мы дополнительно обрабатываем возвращенные данные, сосредотачиваясь на свойстве, которое даст нам IP-адрес, и выводя его на консоль:
Как мы узнаем, что IP-адрес будет сохранен свойством ip из наших возвращенных данных JSON? Самый простой способ — обратиться к документации разработчика ipinfo.io! Каждый веб-сервис будет иметь свой собственный формат для возврата данных по запросу. Нам нужно потратить несколько минут и выяснить, как будет выглядеть ответ, какие параметры нам могут понадобиться для передачи в качестве части запроса для настройки ответа и как нам нужно написать наш код, чтобы получить данные, которые мы хотим. В качестве альтернативы чтению документации разработчика вы всегда можете проверить ответ, возвращаемый запросом, с помощью инструментов разработчика. Используйте любой удобный для вас подход.
Мы еще не закончили с нашим кодом. Иногда обещание приводит к ошибке или неудачному ответу. Когда это произойдет, наше обещание перестанет спускаться по цепочке блоков then и вместо этого будет искать блок catch. Затем код в этом блоке catch будет выполнен. Наш блок catch выглядит следующим образом:
Мы не делаем ничего революционного в нашей обработке ошибок. Мы просто выводим сообщение об ошибке на консоль.
Завершение примера
Прямо сейчас у нас есть пустая страница с нашим IP-адресом, который выводится на консоль. Давайте продолжим и добавим несколько недостающих деталей, чтобы наша текущая страница выглядела как страница примера, которую мы видели в начале. В нашем текущем HTML-документе внесите следующие выделенные изменения:
Самые большие изменения здесь связаны с добавлением некоторых элементов HTML для придания визуальной структуры и CSS, чтобы все выглядело хорошо и правильно. Обратите внимание, что мы также изменили то, что делает наш второй блок then. Вместо того, чтобы выводить наш IP-адрес на консоль, мы отображаем IP-адрес внутри нашего элемента абзаца ipText.
Если вы сейчас просмотрите свою страницу, вы увидите, что ваш IP-адрес отображается со всем темным текстом и удивительным желтым фоном.
- Отправить запрос на сервер
- Проверка статуса запроса
- Получить и проанализировать ответ на запрос
- Прослушивайте событие onreadystatechange, которое помогает реагировать на статус вашего запроса.
Поскольку наш документ в хорошем состоянии, пришло время построить наш пример по одной строке за раз!
Создание запроса
Метод open принимает три аргумента:
Отправка запроса
Метод send отвечает за отправку запроса. Если вы настроите свой запрос как асинхронный (а почему бы и нет), метод send немедленно возвращается, а остальная часть вашего кода продолжает выполняться. Это то поведение, которое нам нужно.
Асинхронные материалы и события
Чтобы все это настроить, добавьте следующую выделенную строку, которая вызывает всемогущий addEventListener :
Эта строка выглядит как любой другой код прослушивания событий, который вы писали много раз. Мы прослушиваем событие readystatechange для нашего объекта xhr и вызываем обработчик события processRequest, когда событие прослушивается. Здесь происходят забавные вещи!
Обработка запроса
Это должно быть легко, верно? У нас есть готовый прослушиватель событий, и все, что нам нужно, это обработчик события processRequest, куда мы можем добавить некоторый код для чтения возвращаемого результата. Давайте продолжим и сначала добавим наш обработчик событий:
Значение | Состояние | Описание |
---|---|---|
0 | НЕ ОТПРАВЛЕНО | Метод open не был вызван еще |
1 | OPENED | Метод отправки был вызван< /td> |
2 | HEADERS_RECEIVED | Вызван метод отправки, и HTTP-запрос вернул статус и заголовки |
3 | ЗАГРУЗКА | Ответ HTTP-запроса загружается |
4 | ГОТОВО | Все выполнено | < /tr> таблица>