Flutter服务器端轻量级解决方案插件server_nano_nano的使用

Flutter服务器端轻量级解决方案插件server_nano_nano的使用

server_nano_nano

一个用Dart编写的超轻量级HTTP服务器。 该项目是伟大的server_nano项目的克隆,但具有以下特点:

  • 不支持WebSocket
  • 没有性能模式
  • 一些修复

🚀 快速开始

安装

要将server_nano_nano集成到您的Dart项目中,请运行:

dart pub add server_nano_nano

基本使用

以下是一个基本示例以帮助您入门:

import 'package:server_nano_nano/server_nano_nano.dart';

void main() {
  final server = Server();

  // 同步请求
  server.get('/', (req, res) {
    res.send('Hello World!');
  });

  // 异步请求
  server.get('/user/:id', (req, res) async {
    // 模拟数据库查询延迟
    await Future.delayed(Duration(seconds: 2));
    res.send('Hello User ${req.params['id']}!');
  });

  server.listen(port: 3000);
}

为什么要使用server_nano_nano? 🤔

  • 友好的APIserver_nano_nano提供了直观易用的API。它类似于express.js,但在Dart中(且更快)。
  • 中间件server_nano_nano支持中间件,帮助您操作请求和响应对象。
  • 静态文件server_nano_nano支持开箱即用的静态文件服务。
  • 安全性server_nano_nano支持HTTPS,并有一个Helmet中间件来缓解常见的Web漏洞。
  • 跨平台server_nano_nano是跨平台的,可以在任何东西上运行!
  • 开源server_nano_nano是开源的,免费使用。
  • 最小足迹server_nano_nano具有最小的足迹,以实现最佳效率。您可以几分钟内读完整个源代码。

📘 API参考

Server:

HTTP:

server_nano_nano支持多种HTTP方法,如GET、POST、PUT、DELETE、PATCH、OPTIONS、HEAD、CONNECT和TRACE。每种方法的语法都很简单:

server.get('/path', handler);
server.post('/path', handler);
server.put('/path', handler);
server.delete('/path', handler);
// ... 和其他方法相同

其中handler是一个接受RequestResponse对象的函数。 例如:

server.get('/user/:id', (req, res) {
  final id = req.params['id'];
  res.send('Hello User $id!');
});

Request:

ContextRequest类表示HTTP请求。它提供了几种方法和属性来帮助提取请求信息:

  • header(name):获取给定名称的所有头。
  • accepts(type):检查请求是否接受特定的MIME类型。
  • isMultipart:检查请求的内容类型是否为’multipart/form-data’。
  • isJson:检查请求的内容类型是否为’application/json’。
  • isForm:检查请求的内容类型是否为’application/x-www-form-urlencoded’。
  • isFormData:检查请求的内容类型是否为’multipart/form-data’。
  • isFile:检查请求的内容类型是否为’application/octet-stream’。
  • isForwarded:检查请求是否由代理或负载均衡器转发。
  • isMime(type, {bool loose = true}):检查请求的内容类型是否匹配特定的MIME类型。loose参数允许部分匹配MIME类型。
  • contentType:获取请求的内容类型。
  • hasContentType:检查请求是否有内容类型头。
  • input:获取原始的HttpRequest对象。
  • query:获取请求的查询参数作为映射。
  • params:获取请求的路由参数作为映射。
  • cookies:获取与请求一起发送的cookie列表。
  • path:获取请求的路径。
  • uri:获取请求的完整URI。
  • session:获取与请求关联的会话。
  • method:获取请求的HTTP方法。
  • certificate:获取请求中使用的SSL证书(如果适用)。
  • param(name):通过名称检索特定参数。首先检查路由参数,然后检查查询参数。
  • payload({Encoding encoder = utf8}):异步获取请求的有效负载。

MultipartUpload类表示来自’multipart/form-data’请求的文件或数据段。它提供了将上传转换为文件或JSON表示的方法。

  • name:上传的名称。
  • filename:上传的文件名。
  • contentType:上传的内容类型。
  • data:上传的数据。
  • toFile({String path}):将上传转换为文件。如果指定了path,文件将写入该路径。否则,将创建一个临时文件。
  • toJson():将上传转换为JSON表示。

Response:

ContextResponse类提供了多种方法帮助您构造响应。以下是所有可用的方法:

  • getHeader(String name):按名称检索头。
  • setHeader(String name, Object value):设置具有特定值的头。
  • addDisposeCallback(DisposeCallback disposer):添加将在响应被处置时调用的回调。
  • setContentType(String contentType):设置Content-Type头。
  • cache(String cacheType, [Map<String, String> options = const {}]):设置Cache-Control头。
  • status(int code):设置响应的HTTP状态码。
  • setCookie(String name, String val, [Map<String, dynamic> options = const {}]):设置带有可选参数的cookie。
  • deleteCookie(String name, [String path = '/']):通过名称删除cookie及其可选路径。
  • getCookie(String name):通过名称检索cookie。
  • attachment(String filename):将Content-Disposition头设置为"attachment"并指定文件名。
  • mime(String path):根据文件扩展名设置Content-Type。
  • send(Object string):发送纯文本响应。
  • sendJson(Object data):发送JSON响应。
  • sendHtmlText(Object data):发送HTML文本响应。
  • sendFile(String path):发送文件作为响应。
  • close():关闭响应并调用任何处置回调。
  • redirect(String url, [int code = 302]):将响应重定向到特定URL并带可选的状态码。

每个方法都是链式的,允许在构建响应时使用流畅接口。例如:

res.status(200).setContentType('text/plain').send('Hello, World!');

中间件:

中间件允许您在请求到达路由处理器之前操作请求和响应对象。它们按添加顺序执行。

Helmet:

Helmet是一个中间件,设置HTTP头以防止一些常见的Web漏洞。使用Helmet中间件的示例如下:

server.use(Helmet());
Helmet设置的头:
  • X-XSS-Protection:有助于防止跨站脚本攻击。
  • X-Content-Type-Options:有助于防止MIME混淆攻击。
  • X-Frame-Options:有助于防止点击劫持攻击。
  • Referrer-Policy:控制应用程序的referrer策略。
  • Content-Security-Policy:有助于防止内容注入攻击。
Cors:

Cors是一个中间件,允许跨域资源共享。使用Cors中间件的示例如下:

server.use(Cors());
创建自定义中间件:

创建自定义中间件很简单。只需扩展Middleware类并覆盖handler方法。

class CustomMiddleware extends Middleware {
  @override
  Future<bool> handler(ContextRequest req, ContextResponse res) async {
    // 您的自定义逻辑在这里。

    // 返回true以继续到下一个中间件。
    // 返回false以停止中间件链。
    return true;
  }
}

Listen:

要启动您的服务器,请调用服务器实例上的listen方法:

server.listen(port: 3000);

SSL/TLS:

您可以通过提供SSL/TLS证书详细信息使您的服务器支持HTTPS:

server.listen(
  host: '0.0.0.0',
  port: 8080,
  certificateChain: 'path_to_certificate_chain.pem',
  privateKey: 'path_to_private_key.pem',
  password: 'optional_password_for_key',
);

服务静态文件:

server_nano_nano支持开箱即用的静态文件服务。只需在服务器实例上调用static方法:

server.static('/path/to/static/files');

更多关于Flutter服务器端轻量级解决方案插件server_nano_nano的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter服务器端轻量级解决方案插件server_nano_nano的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


server_nano 是一个用于 Flutter 的轻量级服务器端解决方案插件,它允许你在 Flutter 应用中快速搭建一个简单的 HTTP 服务器。这个插件非常适合用于开发小型应用、原型设计或需要快速搭建服务器端的场景。

安装 server_nano

首先,你需要在 pubspec.yaml 文件中添加 server_nano 依赖:

dependencies:
  server_nano: ^1.0.0

然后运行 flutter pub get 来安装依赖。

基本用法

以下是一个简单的示例,展示如何使用 server_nano 在 Flutter 应用中创建一个 HTTP 服务器。

import 'package:server_nano/server_nano.dart';

void main() async {
  // 创建一个 Server 实例
  final server = Server();

  // 定义一个 GET 请求处理程序
  server.get('/', (Request request) {
    return Response.ok('Hello, World!');
  });

  // 启动服务器并监听端口
  await server.listen(port: 8080);

  print('Server is running on http://localhost:8080');
}

处理不同的 HTTP 方法

server_nano 支持处理不同的 HTTP 方法,如 GETPOSTPUTDELETE 等。

// 处理 POST 请求
server.post('/submit', (Request request) {
  // 获取请求体中的数据
  final data = request.body;
  return Response.ok('Received: $data');
});

// 处理 PUT 请求
server.put('/update', (Request request) {
  final data = request.body;
  return Response.ok('Updated: $data');
});

// 处理 DELETE 请求
server.delete('/delete', (Request request) {
  return Response.ok('Resource deleted');
});

处理路径参数

你可以通过 :param 语法来定义路径参数,并在处理程序中访问它们。

server.get('/user/:id', (Request request) {
  final userId = request.params['id'];
  return Response.ok('User ID: $userId');
});

处理查询参数

你可以通过 request.queryParams 来访问查询参数。

server.get('/search', (Request request) {
  final query = request.queryParams['q'];
  return Response.ok('Search query: $query');
});

处理静态文件

server_nano 还支持处理静态文件,你可以使用 serveStatic 方法来指定静态文件的目录。

server.serveStatic('/assets', './public');

错误处理

你可以通过 server.errorHandler 来处理未捕获的异常和错误。

server.errorHandler((error) {
  return Response.internalServerError('Something went wrong: $error');
});

停止服务器

你可以通过调用 server.close() 方法来停止服务器。

await server.close();

完整示例

以下是一个完整的示例,展示了如何创建一个简单的 HTTP 服务器,并处理不同的请求类型和参数。

import 'package:server_nano/server_nano.dart';

void main() async {
  final server = Server();

  server.get('/', (Request request) {
    return Response.ok('Hello, World!');
  });

  server.get('/user/:id', (Request request) {
    final userId = request.params['id'];
    return Response.ok('User ID: $userId');
  });

  server.post('/submit', (Request request) {
    final data = request.body;
    return Response.ok('Received: $data');
  });

  server.serveStatic('/assets', './public');

  server.errorHandler((error) {
    return Response.internalServerError('Something went wrong: $error');
  });

  await server.listen(port: 8080);

  print('Server is running on http://localhost:8080');
}
回到顶部