dart Flutter 类似nodejs express的插件express_dt的使用 **优化后输出**: Flutter数据处理或传输插件express_dt的使用

发布于 1周前 作者 sinazl 最后一次编辑是 5天前 来自 Flutter

dart Flutter 类似nodejs express的插件express_dt的使用

Flutter数据处理或传输插件express_dt的使用

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  express_dt: any

然后运行 flutter pub get 来安装该库。

使用

以下是一个完整的示例,展示了如何使用 express_dt 插件来创建一个简单的 REST API 服务器。

import 'package:flutter/material.dart';
import 'package:universal_io/io.dart';
import 'dart:math';

import 'package:express_dt/express_dt.dart';
import 'package:express_dt/src/model/get.dart';
import 'package:express_dt/src/wrapper/cors.dart';
import 'package:path/path.dart' as p;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("express_dt Example"),
        ),
        body: Center(
          child: Text("Check console for server output"),
        ),
      ),
    );
  }
}

dynamic server() {
  var express = Express();

  // 让 express 知道从 `/web` 目录提供服务
  express.use(Express.static('example/web'));

  // 允许跨域请求
  express.use(Cors(['*']));

  // GET 请求示例
  express.get(ExpressMethod(route: '/home', callbacks: [
    (ExpressRequest req, ExpressResponse res) {
      int numb = Random().nextInt(7);
      if (numb % 2 == 0) {
      } else {
        return res
            .statusCode(400)
            .toJson({"message": "Only even numbers allowed"});
      }
    },
    (ExpressRequest req, ExpressResponse res) {
      return res.statusCode(200).sendFile(p.absolute('web/index.html'));
    }
  ]));

  express.get(ExpressMethod(route: '/', callbacks: [
    (ExpressRequest req, ExpressResponse res) {
      int numb = Random().nextInt(7);
      if (numb % 2 == 0) {
      } else {
        return res
            .statusCode(400)
            .toJson({"message": "Only even numbers allowed"});
      }
    },
    (ExpressRequest req, ExpressResponse res) {
      return res.statusCode(200).send('<h1>Hello World</h1>');
    },
  ]));

  // 创建 JWT 令牌的路由
  express.get(ExpressMethod(route: '/tokenRoute', callbacks: [
    (req, res) {
      String token = expressSign('Sjkbdjaksdjas', env['EXPRESS_SECRET_KEY']!);
      return res.statusCode(200).toJson({"token": token});
    }
  ]));

  // 带有中间件验证 JWT 令牌的路由
  express.get(ExpressMethod(route: '/verifyToken', callbacks: [
    (req, res) {
      String? token = extractTokenFromHeader(req.headers);
      if (token == null) {
        return res.statusCode(400).send('Authorization Failed');
      } else {
        var data = expressVerify(token, env['EXPRESS_SECRET_KEY']!);
        if (data == null) {
          return res.statusCode(400).send('Authorization Failed');
        }
      }
    },
    (req, res) {
      return res.statusCode(200).send('Authorized');
    }
  ]));

  // POST 请求示例
  express.post(ExpressMethod(route: '/post', callbacks: [
    (ExpressRequest req, ExpressResponse res) async {
      return res.statusCode(200).toJson(req.body);
    }
  ]));

  // 返回纯文本的路由
  express.get(ExpressMethod(route: '/text', callbacks: [
    (ExpressRequest req, ExpressResponse res) {
      return res.statusCode(200).send('data');
    }
  ]));

  // 处理请求参数的路由
  express.get(ExpressMethod(route: '/param/:username', callbacks: [
    (ExpressRequest req, ExpressResponse res) {
      return res.statusCode(200).toJson({'params': req.params});
    }
  ]));

  // 处理查询参数的路由
  express.get(ExpressMethod(route: '/query', callbacks: [
    (ExpressRequest req, ExpressResponse res) {
      return res.statusCode(200).toJson(req.query);
    }
  ]));

  // 处理文件上传的路由
  express.post(ExpressMethod(route: 'upload', callbacks: [
    (req, res) async {
      for (var i = 0; i < req.files.keys.length; i++) {
        var file = File(req.files[req.files.keys.toList()[i]]!.filename!);
        await for (var data in req
            .files[req.files.keys.toList()[i]]!.streamController!.stream) {
          if (data is String) {
            await file.writeAsString(data, mode: FileMode.append);
          } else {
            await file.writeAsBytes(data, mode: FileMode.append);
          }
        }
      }

      return res.statusCode(200).toJson(req.body);
    }
  ]));

  // 绑定服务器到端口 4000
  express.stream(4000, callback: () {});
}

发起请求

  • 使用 ExpressMethod 发起请求。
  • 它接受一个路由参数和一组回调函数。
  • 可以有一个单一的函数,也可以有中间件和回调函数。
  • 回调函数接受 ExpressRequestExpressResponse 作为参数。

其他可用的请求类型

  • PUT
  • PATCH
  • DELETE
  • COPY
  • HEAD
  • OPTIONS
  • LINK
  • UNLINK
  • PURGE
  • LOCK
  • UNLOCK
  • PROFIND
  • VIEW

安全路由

// 创建 JWT 令牌的路由
  express.get(ExpressMethod(route: '/tokenRoute', callbacks: [
    (req, res) {
      String token = expressSign('Sjkbdjaksdjas', env['EXPRESS_SECRET_KEY']!);
      return res.statusCode(200).toJson({"token": token});
    }
  ]));

  // 带有中间件验证 JWT 令牌的路由
  express.get(ExpressMethod(route: '/verifyToken', callbacks: [
    (req, res) {
      String? token = extractTokenFromHeader(req.headers);
      if (token == null) {
        return res.statusCode(400).send('Authorization Failed');
      } else {
        var data = expressVerify(token, env['EXPRESS_SECRET_KEY']!);
        if (data == null) {
          return res.statusCode(400).send('Authorization Failed');
        }
      }
    },
    (req, res) {
      return res.statusCode(200).send('Authorized');
    }
  ]));

处理 HTML 文件

// 让 express 知道从 `/web` 目录提供服务
  express.use(Express.static('example/web'));

  express.get(ExpressMethod(route: '/home', callbacks: [
    (ExpressRequest req, ExpressResponse res) {
      return res.statusCode(200).sendFile(p.absolute('web/index.html'));
    }
  ]));

管理会话

你可以通过两种方式管理会话。一种是由 express_dt 自动管理会话,另一种是手动管理每个路由。

如果由 express_dt 自动管理会话,则所有路由都会受到会话保护,如果会话授权失败,路由将失败。会话值也使用 JWT 加密并存储在用户 cookie 中。这种方法目前不灵活且不可定制。

import 'dart:async';
import 'dart:convert';
import 'package:universal_io/io.dart';
import 'dart:math';
import 'package:express_dt/express_dt.dart';
import 'package:path/path.dart' as p;
import 'package:dotenv/dotenv.dart' show load, clean, isEveryDefined, env;

dynamic main() {
  load();
  var config =
      ExpressJwtConfig(env['EXPRESS_SECRET_KEY']!, issuer: 'express.com');

  var expressSession =
      JwtSession(config, io: SessionIoCookie(cookieName: 'express'));

  var express = Express();

  // 让 express 知道从 `/web` 目录提供服务
  express.use(Express.static('example/web'));

  // 允许跨域请求
  express.use(Cors(['*']));

  // 如果你想让所有路由都受会话保护,路由将因未经授权的会话而失败。
  express.use(ExpressSessions(env['EXPRESS_SECRET_KEY']!, expressSession));

  // 管理会话示例
  // 这个路由自动创建一个会话,因为我们已经告诉 express 使用 EXPRESS SESSION。
  express.post(ExpressMethod(route: '/sessions', callbacks: [
    (req, res) async {
      return res.statusCode(200).toJson({'session': res.cookies.toString()});
    }
  ]));

  // 验证会话
  // 如果会话无效,请求将失败。
  express.get(
    ExpressMethod(
      route: '/verify_sessions',
      callbacks: [
        (req, res) async {
          Session session = await expressSession.parse(req);
          print(session['authorization']);
        }
      ],
    ),
  );
}

但是,如果你想要灵活性,并且不想让所有路由都受保护,或者希望程序化地处理错误,那么手动管理会话是更好的选择。

import 'dart:async';
import 'dart:convert';
import 'package:universal_io/io.dart';
import 'dart:math';
import 'package:express_dt/express_dt.dart';
import 'package:path/path.dart' as p;
import 'package:dotenv/dotenv.dart' show load, clean, isEveryDefined, env;

var express = Express();

// 让 express 知道从 `/web` 目录提供服务
express.use(Express.static('example/web'));

// 允许跨域请求
express.use(Cors(['*']));

// 手动处理会话
express.post(ExpressMethod(route: '/post', callbacks: [
  (ExpressRequest req, ExpressResponse res) async {
    // 手动处理会话
    final Session session = await req.session;
    session.clear();
    session['authorization'] = 'AuthorizationValue';
    // 将值保存在响应 cookie 中
    res.cookiess(Cookie('authorization', 'AuthorizationValue'));
    return res.statusCode(200).toJson({"sas": res.cookies});
  }
]));

// 纯文本
// 手动验证会话
express.get(ExpressMethod(route: '/text', callbacks: [
  (ExpressRequest req, ExpressResponse res) async {
    // 手动检查会话
    print(req.cookies.toString());
    Cookie? auth = req.cookies['authorization'];
    if (auth == null || auth.value != 'AuthorizationValue') {
      return res.statusCode(HttpStatus.unauthorized);
    }

    return res.statusCode(200).send('data');
  }
]));

更多关于dart Flutter 类似nodejs express的插件express_dt的使用 **优化后输出**: Flutter数据处理或传输插件express_dt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于dart Flutter 类似nodejs express的插件express_dt的使用 **优化后输出**: Flutter数据处理或传输插件express_dt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


虽然express_dt这个Flutter插件的具体功能被定义为“undefined”,但基于其名称“express_dt”(可能代表“express data transfer”或类似的含义),我们可以合理推测它可能用于数据的快速处理或传输。以下是一个基于这种假设的示例代码,展示如何在Flutter项目中使用一个假设的express_dt插件来进行数据传输和处理。

假设的express_dt插件使用示例

首先,我们需要在pubspec.yaml文件中添加对这个假设插件的依赖(请注意,实际使用时需要替换为真实的插件依赖):

dependencies:
  flutter:
    sdk: flutter
  express_dt: ^x.y.z  # 假设的版本号,实际使用时需要替换为真实版本号

然后,运行flutter pub get来安装插件。

接下来,我们编写一个Flutter应用,展示如何使用这个假设的express_dt插件。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:express_dt/express_dt.dart';  // 假设的插件导入

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Express DT Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String dataReceived = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Express DT Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Received Data:',
              style: TextStyle(fontSize: 20),
            ),
            Text(
              dataReceived,
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 假设的express_dt插件方法调用,用于发送和接收数据
                String result = await ExpressDt.sendAndReceiveData("Hello, Express DT!");
                setState(() {
                  dataReceived = result;
                });
              },
              child: Text('Send Data'),
            ),
          ],
        ),
      ),
    );
  }
}

// 假设的ExpressDt类,实际使用时需要替换为插件提供的真实类和方法
class ExpressDt {
  static Future<String> sendAndReceiveData(String data) async {
    // 这里模拟数据发送和接收的过程
    // 实际使用时,应该调用插件提供的API来完成数据传输
    await Future.delayed(Duration(seconds: 2));  // 模拟网络延迟
    return "Received: $data";
  }
}

注意事项

  1. 插件API:上述代码中的ExpressDt类及其sendAndReceiveData方法是假设的,实际使用时需要参考express_dt插件的官方文档来了解其真实的API。

  2. 错误处理:在实际应用中,应该添加适当的错误处理逻辑来处理数据传输过程中可能出现的异常情况。

  3. 插件安装:确保你已经正确安装了express_dt插件,并且其版本与你的Flutter环境兼容。

  4. 插件文档:由于express_dt是一个假设的插件名称,因此上述代码中的用法并不适用于任何真实存在的插件。在实际使用时,请务必参考插件的官方文档来了解其正确的使用方法和API。

希望这个示例能够帮助你理解如何在Flutter项目中使用一个假设的express_dt插件来进行数据处理或传输。如果你找到了真实的express_dt插件或者有类似的插件需求,请务必参考其官方文档来获取准确的信息。

回到顶部