使用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服务器。
服务器向客户端展示证书。证书链和私钥设置在传递给bindSecure
的SecurityContext
对象中。
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监听新连接。这将关闭带有完成事件的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< 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, }) → Future< HttpServer> - 在指定的
address
和port
上开始监听HTTP请求。 -
bindSecure(
dynamic address, int port, SecurityContext context, {int backlog = 0, bool v6Only = false, bool requestClientCertificate = false, }) → Future< HttpServer> address
参数可以是 String 或 InternetAddress。如果address
是 String 类型,bind 将执行 InternetAddress.lookup 并使用列表中的第一个值。若要监听回环适配器,只允许来自本地主机的连接,请使用 InternetAddress.loopbackIPv4 或 InternetAddress.loopbackIPv6。若要允许来自网络的连接,请使用 InternetAddress.anyIPv4 或 InternetAddress.anyIPv6 绑定到所有接口或特定接口的 IP 地址。