Работа с протоколом http

Http-сервер HttpServer

Последнее обновление: 13.04.2023

Библиотека dart:io предоставляет функционал для работы с протоколом http/https. Вначале рассмотрим создание http-сервера.

Http-сервер представляет программу, которая принимает запросы по протоколу http и обратно отправляет некоторый ответ. Например, чтобы пользователи могли обращаться к веб-сайту, веб-сайт должен размещаться на http-сервере.

Для создания http-сервера в библиотеке dart:io имеется класс HttpServer

Создание сервера

Для создания сервера применяется статический метод bind():

Future<HttpServer> bind(dynamic address, int port, {int backlog = 0, bool v6Only = false, bool shared = false})

Этот метод принимает два обязательных параметра:

  • address: адрес, по которому будет запущен сервер

  • port: номер порта, по которому будет запущен сервер

Адрес может представлять строку (объект String) или объект класса InternetAddress. Если адрес представляет строку, например, "localhost", то метод bind() выполняет функцию InternetAddress.lookup, которая возвращает набор ip-адресов, связанный с этой строкой. Метод bind берет из этого списка первый адрес и прослушивает по нему входящие подключения.

В качестве адреса также можно использовать объект InternetAddress. Этот класс имеет четыре готовых ip-адреса, которые хранятся в статических свойствах:

  • InternetAddress.anyIPv4: любой IP-адрес версии 4

  • InternetAddress.anyIPv6: любой IP-адрес версии 6

  • InternetAddress.loopbackIPv4: любой локальный IP-адрес версии 4 (доступен только для запросов с текущего компьютера)

  • InternetAddress.loopbackIPv6: любой локальный IP-адрес версии 6 (доступен только для запросов с текущего компьютера)

Если применяются значения InternetAddress.anyIPv6 и InternetAddress.loopbackIPv6, то будут прослушиваться как ip-адреса 6-й версии, так и ip-адреса 4-й версии.

Каждое сетевое приложение, которое прослушивает входящие запросы, запускается на определенном порту. Порт представляет значение от 0 до 65535. Мы можем выбрать один из незанятых портов (обычно занятых портов не так много). Если порт имеет значение 0, система выберет временный порт.

Используем эти параметры и создадим объект сервера:

import 'dart:io';

void main() async {
  var server = await HttpServer.bind(InternetAddress.anyIPv6, 8888);
}

Здесь с помощью адреса InternetAddress.anyIPv6 устанавливается прослушивание любого доступного адреса. При этом прослушиваться будут запросы по порту 8888.

Получение запросов

Объект HttpServer фактически представляет поток объектов HttpRequest, каждый из которых представляет отдельный запрос. То есть когда приходит запрос, http-сервер получает этот запрос в виде HttpRequest. Для прослушивания запросов применяется бесконечный цикл, который можно организовать разными способами.

Первый способ представляет метод forEach()

Future forEach(void action(HttpRequest element))

В этот метод передается функция обратного вызова, которая принимает запрос - объект HttpRequest. И каждый раз, когда приходит запрос, срабатывает эта функция. Применение

import 'dart:io';

void main() async {
  var server = await HttpServer.bind(InternetAddress.anyIPv6, 8888);
  print("Сервер запущен...");
  await server.forEach((HttpRequest request) {
      // обработка запроса
  });
}

С каждым объектом HttpRequest через свойство response связан объект класса HttpResponse, который представляет ответ сервера. HttpResponse с помощью метода write() позволяет отправить в ответ различое содержимое. Например:

import 'dart:io';

void main() async {
  var server = await HttpServer.bind(InternetAddress.anyIPv6, 8888);
  print("Сервер запущен...");
  await server.forEach((HttpRequest request) {

    final response = request.response;    // получае объект ответа
    response.write("Hello METANIT.COM");  // отправляем в ответ строку "Hello METANIT.COM"
    response.close();                     // закрываем и отправляем ответ
  });
}

Здесь с помощью метода write() отправляем в ответ клиенту строку "Hello METANIT.COM". Для закрытия и отправки ответа клиенту у объекта HttpResponse вызывается метод close

response.close();

Запустим программу:

c:\dart>dart main.dart
Сервер запущен...

Теперь мы можем обратиться к http-серверу, для чего нам нужен http-клиент. В качестве такого клиента часто выступает веб-браузер. Для обращения к локальному http-серверу нам нужено указать его хост и порт в формате:

хост:порт

Обычно для обращения к локальному http-серверу применяется хост "localhost" или "127.0.0.1". Поэтому откроем веб-браузер и введем строку адреса http://localhost:8888. И браузер нам отобразит отправленную строку

http-сервер HttpServer в языке программирования Dart

Другой способ получения и обработки запроса в бесконечном цикле представляет использование цикла for-in:

import 'dart:io';

void main() async {
  var server = await HttpServer.bind(InternetAddress.anyIPv6, 8888);
  print("Сервер запущен...");
  await for (final request in server) {

    final response = request.response;
    response.write("Hello METANIT.COM");
    response.close();
  }
}

Результат будет аналогичен предыдущему.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850