长远的目标
Dart的初学者一边学一边记,下面是我的目前学习目标:
- 大部分函数库熟练使用
- Flutter 熟练使用
实现的目标
一个最基本的WebFramework功能
- 路由
- 文件下载
思路&想法
首先判断dart能不能实现HttpServer。经过查阅文档答案是√
HttpServer在dart:io这个库里面
这是类的定义
abstract class HttpServer implements Stream<HttpRequest>
翻阅函数列表发现有个函数名称非常熟悉
static Future<HttpServer> bind(address, int port,
{int backlog: 0, bool v6Only: false, bool shared: false})
主要参数:
address
绑定的IP地址port
绑定的IP地址
返回类型是 Future 不了解的同学可以百度之类的
暂时还不理解为什么address 为什么没有类型,或者我可以理解他既是类型又是名称?
address的参数只能为InternetAddress
的常量。
- loopbackIPv4
- loopbackIPv6
- anyIPv4
- anyIPv6
Value | Use case |
---|---|
LOOPBACK_IP_V4 or LOOPBACK_IP_V6 | 只能监听本地地址 如果线上服务器不推荐,推荐本地调试用 |
ANY_IP_V4 or ANY_IP_V6 | 监听任何IP地址,推荐线上使用 |
这里我们使用loopbackIPv4
代码实现
HttpServer.bind(InternetAddress.loopbackIPv4, port).then((HttpServer server){
//处理代码
}).catchError((e) => print("出现错误:" + e.toString()));
这种回调方式跟 JS 的 Promise 很类似
这里绑定成功后我们就要监听
server.listen((HttpRequest request) {
//控制跟浏览器的通讯
});
这里我们成功的获取到了HttpRequest对象,我们可以获取http头信息、请求参数、请求路径
//打印出来请求url
print(request.uri);
//设置http头 如果不指定为text/html 那么浏览器是没法解析html内容
request.response.headers.add("Content-Type", "text/html; charset=UTF-8");
//指定http的状态码
request.response.statusCode = 333;
//设置 headers 跟 statusCode都应该在response.write前 应为 write执行后会自动发送报头
request.response.write("<h1>http_server</h1>");
request.response.write("hello dart");
request.response.close();
一般来说request
是来获取浏览器向服务器发送的信息,负责返回信息是response
而在Dart里面response
被设计的是从request
中获取。
这种写法很普通我换一种dart风格的写法
request.response
..headers.add("Content-Type", "text/html; charset=UTF-8")
..statusCode = 333
..write("<h1>http_server</h1>")
..write("hello dart")
..close();
完整代码
import 'dart:io';
void main() {
var port = 4049;
HttpServer.bind(InternetAddress.loopbackIPv4, port).then((HttpServer server) {
server.listen((HttpRequest request) {
request.response
..headers.add("Content-Type", "text/html; charset=UTF-8")
..statusCode = 333
..write("<h1>http_server</h1>")
..write("hello dart")
..close();
});
}).catchError((e) => print("出现错误:" + e.toString()));
}