Класс HttpServer
Сервер, который доставляет контент, например веб-страницы, используя протокол HTTP.
Примечание: HttpServer предоставляет низкоуровневые функции HTTP. Рекомендуем оценить высокоуровневые API, рассмотренные в разделе Создание HTTP-серверов на сайте dart.dev.
HttpServer — это Stream, предоставляющий объекты HttpRequest. С каждым HttpRequest связан объект HttpResponse. Сервер отвечает на запрос, записывая данные в этот объект HttpResponse. В следующем примере показано, как привязать HttpServer к IPv6-адресу InternetAddress на порту 80 (стандартном порту для HTTP-серверов) и как прослушивать запросы. Порт 80 — это порт HTTP по умолчанию. Однако в большинстве систем для доступа к нему требуются права суперпользователя. Для локального тестирования рассмотрите возможность использования незарезервированного порта (1024 и выше).
import 'dart:io';
void main() async {
var server = await HttpServer.bind(InternetAddress.anyIPv6, 80);
await server.forEach((HttpRequest request) {
request.response.write('Hello, world!');
request.response.close();
});
} Неполные запросы, в которых отсутствует весь заголовок или его часть, игнорируются; для них не генерируются исключения или объекты HttpRequest. Аналогично, при записи в HttpResponse любые исключения Socket игнорируются, как и любые последующие операции записи.
HttpRequest предоставляет заголовки запроса, а также тело запроса, если оно есть, в виде потока данных. Если тело не было прочитано, оно отбрасывается при записи сервера в HttpResponse или при его закрытии.
Привязка с защищённым HTTPS-соединением
Используйте bindSecure, чтобы создать HTTPS-сервер.
Сервер предъявляет клиенту сертификат. Цепочка сертификатов и закрытый ключ задаются в объекте SecurityContext, передаваемом в bindSecure.
import 'dart:io';
void main() async {
var chain =
Platform.script.resolve('certificates/server_chain.pem').toFilePath();
var key = Platform.script.resolve('certificates/server_key.pem').toFilePath();
var context = SecurityContext()
..useCertificateChain(chain)
..usePrivateKey(key, password: 'dartdart');
var server =
await HttpServer.bindSecure(InternetAddress.anyIPv6, 443, context);
await server.forEach((HttpRequest request) {
request.response.write('Hello, world!');
request.response.close();
});
} Сертификаты и ключи представлены PEM-файлами, которые можно создавать и обрабатывать с помощью инструментов OpenSSL.
- Реализуемые типы
Конструкторы
- HttpServer.listenOn(ServerSocket serverSocket) фабричный
- Присоединяет HTTP-сервер к существующему ServerSocket. При закрытии HttpServer он просто отсоединяется, закрывая текущие соединения, но не закрывая
serverSocket.
Свойства
- address → InternetAddress только для чтения
- Адрес, который прослушивает сервер.
- autoCompress ↔ bool чтение и запись
- Нужно ли HttpServer сжимать контент, если это возможно.
- defaultResponseHeaders → HttpHeaders только для чтения
- Набор заголовков по умолчанию, добавляемых ко всем объектам ответа.
- first → Future<
HttpRequest> только для чтения, унаследованное - Первый элемент этого потока.
- hashCode → int только для чтения, унаследованное
- Хеш-код этого объекта.
- idleTimeout ↔ Duration? чтение и запись
- Получает или задаёт время ожидания для незанятых постоянных соединений. Если в течение периода idleTimeout после завершения предыдущего запроса не поступает новый запрос, соединение разрывается.
- isBroadcast → bool только для чтения, унаследованное
- Является ли этот поток широковещательным.
- isEmpty → Future<
bool> только для чтения, унаследованное - Содержит ли этот поток какие-либо элементы.
- last → Future<
HttpRequest> только для чтения, унаследованное - Последний элемент этого потока.
- length → Future<
int> только для чтения, унаследованное - Количество элементов в этом потоке.
- port → int только для чтения
- Порт, который прослушивает сервер.
- runtimeType → Type только для чтения, унаследованное
- Представление типа объекта во время выполнения.
- serverHeader ↔ String? чтение и запись
- Получает и задаёт значение по умолчанию заголовка
Serverдля всех ответов, созданных этим HttpServer. - sessionTimeout ← int только для записи
- Задаёт время ожидания в секундах для сеансов этого HttpServer.
- single → Future<
HttpRequest> только для чтения, унаследованное - Единственный элемент этого потока.
Методы
- any(
bool test(HttpRequest element)) → Future< bool> унаследованный - Проверяет, принимает ли
testкакой-либо элемент, предоставленный этим потоком. - asBroadcastStream(
{void onListen(StreamSubscription< HttpRequest> subscription)?, void onCancel(StreamSubscription< HttpRequest> subscription)?}) → Stream< HttpRequest> унаследованный - Возвращает поток с несколькими подписками, выдающий те же события, что и этот поток.
- asyncExpand<
E>( Stream< E>? convert(HttpRequest event)) → Stream< E> унаследованный - Преобразует каждый элемент в последовательность асинхронных событий.
- asyncMap<
E>( FutureOr< E> convert(HttpRequest event)) → Stream< E> унаследованный - Создаёт новый поток, в котором каждое событие данных этого потока асинхронно преобразуется в новое событие.
- cast<
R>( ) → Stream< R> унаследованный - Адаптирует этот поток, чтобы он стал
Stream<R>. - close(
{bool force = false}) → Future - Окончательно прекращает прослушивание этим HttpServer новых соединений. Закрывает Stream объектов HttpRequest событием завершения. Возвращённый future завершается, когда сервер остановлен. Для сервера, запущенного с помощью bind или bindSecure, это означает, что прослушиваемый порт больше не используется.
- connectionsInfo(
) → HttpConnectionsInfo - Объект HttpConnectionsInfo, содержащий сводные сведения о количестве текущих соединений, обрабатываемых сервером.
- contains(
Object? needle) → Future< bool> унаследованный - Возвращает, встречается ли
needleсреди элементов, предоставляемых этим потоком. - distinct(
[bool equals(HttpRequest previous, HttpRequest next)?]) → Stream< HttpRequest> унаследованный - Пропускает события данных, равные предыдущему событию данных.
- drain<
E>( [E? futureValue]) → Future< E> унаследованный - Отбрасывает все данные этого потока, но сообщает о его завершении или возникновении ошибки.
- elementAt(
int index) → Future< HttpRequest> унаследованный - Возвращает значение
index-го события данных этого потока. - every(
bool test(HttpRequest element)) → Future< bool> унаследованный - Проверяет, принимает ли
testвсе элементы, предоставленные этим потоком. - expand<
S>( Iterable< S> convert(HttpRequest element)) → Stream< S> унаследованный - Преобразует каждый элемент этого потока в последовательность элементов.
- firstWhere(
bool test(HttpRequest element), {HttpRequest orElse()?}) → Future< HttpRequest> унаследованный - Находит первый элемент этого потока, соответствующий
test. - fold<
S>( S initialValue, S combine(S previous, HttpRequest element)) → Future< S> унаследованный - Объединяет последовательность значений, многократно применяя
combine. - forEach(
void action(HttpRequest element)) → Future унаследованный - Выполняет
actionдля каждого элемента этого потока. - handleError(
Function onError, {bool test(dynamic error)?}) → Stream< HttpRequest> унаследованный - Создаёт поток-обёртку, перехватывающий некоторые ошибки этого потока.
- join(
[String separator = ""]) → Future< String> унаследованный - Объединяет строковые представления элементов в одну строку.
- lastWhere(
bool test(HttpRequest element), {HttpRequest orElse()?}) → Future< HttpRequest> унаследованный - Находит последний элемент этого потока, соответствующий
test. - listen(
void onData(HttpRequest event)?, {Function? onError, void onDone()?, bool? cancelOnError}) → StreamSubscription< HttpRequest> унаследованный - Добавляет подписку на этот поток.
- map<
S>( S convert(HttpRequest event)) → Stream< S> унаследованный - Преобразует каждый элемент этого потока в новое событие потока.
- noSuchMethod(
Invocation invocation) → dynamic унаследованный - Вызывается при обращении к несуществующему методу или свойству.
- pipe(
StreamConsumer< HttpRequest> streamConsumer) → Future унаследованный - Передаёт события этого потока в
streamConsumer. - reduce(
HttpRequest combine(HttpRequest previous, HttpRequest element)) → Future< HttpRequest> унаследованный - Объединяет последовательность значений, многократно применяя
combine. - singleWhere(
bool test(HttpRequest element), {HttpRequest orElse()?}) → Future< HttpRequest> унаследованный - Находит единственный элемент этого потока, соответствующий
test. - skip(
int count) → Stream< HttpRequest> унаследованный - Пропускает первые
countсобытий данных этого потока. - skipWhile(
bool test(HttpRequest element)) → Stream< HttpRequest> унаследованный - Пропускает события данных этого потока, пока они соответствуют
test. - take(
int count) → Stream< HttpRequest> унаследованный - Предоставляет не более первых
countсобытий данных этого потока. - takeWhile(
bool test(HttpRequest element)) → Stream< HttpRequest> унаследованный - Передаёт события данных, пока
testвозвращает true. - timeout(
Duration timeLimit, {void onTimeout(EventSink< HttpRequest> sink)?}) → Stream< HttpRequest> унаследованный - Создаёт новый поток с теми же событиями, что и у этого потока.
- toList(
) → Future< List< HttpRequest>> унаследованный - Собирает все элементы этого потока в
List. - toSet(
) → Future< Set< HttpRequest>> унаследованный - Собирает данные этого потока в
Set. - toString(
) → String унаследованный - Строковое представление этого объекта.
- transform<
S>( StreamTransformer< HttpRequest, S> streamTransformer) → Stream< S> унаследованный - Применяет
streamTransformerк этому потоку. - where(
bool test(HttpRequest event)) → Stream< HttpRequest> унаследованный - Создаёт на основе этого потока новый поток, отбрасывающий некоторые элементы.
Операторы
- operator ==(
Object other) → bool унаследованный - Оператор равенства.
Статические методы
- bind(
dynamic address, int port, {int backlog = 0, bool v6Only = false, bool shared = false}) → Future< HttpServer> - Начинает прослушивание HTTP-запросов по указанным
addressиport. - bindSecure(
dynamic address, int port, SecurityContext context, {int backlog = 0, bool v6Only = false, bool requestClientCertificate = false, bool shared = false}) → Future< HttpServer> -
addressможет быть строкой String или объектом InternetAddress. Еслиaddress— строка String, bind выполнит поиск InternetAddress.lookup и использует первое значение в списке. Чтобы прослушивать адаптер loopback, который разрешает только входящие соединения с локального компьютера, используйте значение InternetAddress.loopbackIPv4 или InternetAddress.loopbackIPv6. Чтобы разрешить входящие соединения из сети, используйте одно из значений InternetAddress.anyIPv4 или InternetAddress.anyIPv6 для привязки ко всем интерфейсам либо IP-адрес конкретного интерфейса.
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.19.6/dart-io/HttpServer-class.html