HttpServer抽象

使用HTTP协议发送内容的服务器,例如网页。

注意:HttpServer提供低级HTTP功能。我们建议用户评估在编写HTTP服务器中讨论的高级API,请访问dart.dev

HttpServer是一个提供HttpRequest对象的Stream。每个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服务器。

服务器向客户端展示证书。证书链和私钥设置在传递给bindSecureSecurityContext对象中。

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关闭时,HttpServer将只是断开自身,关闭当前连接但不会关闭serverSocket
工厂

属性

address InternetAddress
服务器正在监听的地址。
无设置器
autoCompress bool
是否在可能的情况下压缩 HttpServer 的内容。
getter/setter 对
defaultResponseHeaders HttpHeaders
添加到所有响应对象中的默认头集合。
无设置器
first Future<HttpRequest>
此流的第一个元素。
无setter继承
hashCode int
此对象的哈希码。
无setter继承
idleTimeout Duration?
获取或设置用于空闲长连接的超时时间。如果在完成上一个请求后的 idleTimeout 内没有看到进一步请求,则断开连接。
getter/setter 对
isBroadcast bool
此流是否为广播流。
无setter继承
isEmpty Future<bool>
此流是否包含任何元素。
无setter继承
last Future<HttpRequest>
此流的最后一个元素。
无setter继承
length Future<int>
此流中的元素数量。
无setter继承
port int
服务器监听的端口。
无设置器
runtimeType Type
表示对象运行时类型的表示。
无setter继承
serverHeader String?
获取并设置此 HttpServer 生成的所有响应的默认 Server 头的值。
getter/setter 对
sessionTimeout int
设置此 HttpServer 会话的超时时间(以秒为单位)。
无getter
single Future<HttpRequest>
此流的单个元素。
无setter继承

方法

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监听新连接。这将关闭带有完成事件的StreamHttpRequest。返回的future完成时,服务器停止。对于使用bindbindSecure启动的服务器,这意味着监听的端口不再使用。
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<void>
对每个流中的元素执行 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 成功时转发数据事件。
继承
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>
在指定的addressport上开始监听HTTP请求。
bindSecure(dynamic address, int port, SecurityContext context, {int backlog = 0, bool v6Only = false, bool requestClientCertificate = false, bool shared = false}) Future<HttpServer>
address 参数可以是 StringInternetAddress。如果 addressString 类型,bind 将执行 InternetAddress.lookup 并使用列表中的第一个值。若要监听回环适配器,只允许来自本地主机的连接,请使用 InternetAddress.loopbackIPv4InternetAddress.loopbackIPv6。若要允许来自网络的连接,请使用 InternetAddress.anyIPv4InternetAddress.anyIPv6 绑定到所有接口或特定接口的 IP 地址。