Flutter HTTP请求体解析插件belatuk_body_parser的使用

Flutter HTTP请求体解析插件belatuk_body_parser的使用

Pub Version (包括预发布版本) 空安全 许可证

替换不支持非空安全的package:body_parser并进行重大更改以支持NNBD。

在Dart中解析请求体和查询字符串,以及多部分表单数据上传。无需任何外部依赖。

这是支持依赖注入、WebSocket等功能的Angel3框架的核心请求体解析器。如果您正在寻找一个服务器端解决方案,那么我强烈推荐它作为您的首选。

目录

关于

此包类似于Express.js的body-parser模块。它完全支持JSON、x-www-form-urlencoded以及查询字符串请求。您还可以在查询中包含数组,就像在PHP应用中一样。这的好处是原始类型会自动正确地反序列化。例如,如果您有一个hello=1.5的请求,则body[‘hello’]将等于1.5而不是’1.5’

安装

要为您的Dart项目安装Body Parser,只需在您的pubspec.yaml文件中添加belatuk_body_parser依赖项。

dependencies:
  belatuk_body_parser: ^5.2.0

使用

Body Parser提供了一个名为BodyParseResult的简单类。通过调用Future<BodyParseResult> parseBody方法,您可以轻松解析查询字符串和请求体。

import 'dart:convert';
import 'package:belatuk_body_parser/belatuk_body_parser.dart';

main() async {
  // ...
  await for (HttpRequest request in server) {
    request.response.write(JSON.encode(await parseBody(request).body));
    await request.response.close();
  }
}

您也可以使用buildMapFromUri(Map, String)方法从URL编码的字符串填充一个映射。

这可以与像Angel3 JSON God这样的库一起使用来构建结构化的JSON/REST API。添加验证后,您就可以立即拥有一个后端。

MyClass create(HttpRequest request) async {
  return god.deserialize(await parseBody(request).body, MyClass);
}

自定义请求体解析

在需要解析无法识别的内容类型的情况下,body_parser本身可能不会对您有任何帮助。然而,您可以使用BodyParseResultoriginalBuffer属性查看原始请求缓冲区。为了获得这种功能,在调用parseBody时传递storeOriginalBuffertrue

例如,如果您想要解析GraphQL查询…

app.get('/graphql', (req, res) async {
  if (req.headers.contentType.mimeType == 'application/graphql') {
    var graphQlString = String.fromCharCodes(req.originalBuffer);
    // ...
  }
});

示例代码

以下是使用belatuk_body_parser的一个完整示例:

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:isolate';
import 'package:http_parser/http_parser.dart';
import 'package:belatuk_body_parser/belatuk_body_parser.dart';

void main() async {
  var address = '127.0.0.1';
  var port = 3000;
  var futures = <Future>[];

  for (var i = 1; i < Platform.numberOfProcessors; i++) {
    futures.add(Isolate.spawn(start, [address, port, i]));
  }

  await Future.wait(futures).then((_) {
    print('所有实例已启动。');
    print('测试命令: "wrk -t12 -c400 -d30s -s ./example/post.lua http://localhost:3000" 或类似命令');
    start([address, port, 0]);
  });
}

void start(List args) {
  var address = InternetAddress(args[0] as String);
  var port = 8080;
  if (args[1] is int) {
    args[1];
  }

  var id = 0;
  if (args[2] is int) {
    args[2];
  }

  HttpServer.bind(address, port, shared: true).then((server) {
    server.listen((request) async {
      // 忽略:弃用成员使用
      var body = await defaultParseBody(request);
      request.response
        ..headers.contentType = ContentType('application', 'json')
        ..write(json.encode(body.body));
      await request.response.close();
    });

    print(
        '服务器 #$id 正在监听 http://${server.address.address}:${server.port}');
  });
}

Future<BodyParseResult> defaultParseBody(HttpRequest request,
    {bool storeOriginalBuffer = false}) {
  return parseBodyFromStream(
      request,
      request.headers.contentType != null
          ? MediaType.parse(request.headers.contentType.toString())
          : null,
      request.uri,
      storeOriginalBuffer: storeOriginalBuffer);
}

更多关于Flutter HTTP请求体解析插件belatuk_body_parser的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter HTTP请求体解析插件belatuk_body_parser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 belatuk_body_parser 插件来解析 Flutter HTTP 请求体的示例代码。这个插件通常用于 Dart 后端服务,尤其是在使用 shelf 框架时解析请求体。虽然 Flutter 主要用于构建客户端应用,但了解如何在后端处理请求体对于理解整个 HTTP 通信流程是很有帮助的。

首先,确保你的 pubspec.yaml 文件中包含以下依赖项:

dependencies:
  shelf: ^1.2.0
  belatuk_body_parser: ^2.0.0

然后,运行 flutter pub getdart pub get 来获取这些依赖项。

下面是一个简单的 Dart 后端服务器示例,它使用 shelfbelatuk_body_parser 来处理 HTTP 请求并解析请求体:

import 'dart:convert';
import 'dart:io';

import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:belatuk_body_parser/belatuk_body_parser.dart';

void main() {
  var parser = BodyParser();

  var router = Router();

  router.post('/data', (Request request) async {
    var body = await parser.parseRequest(request);
    if (body is Map<String, dynamic>) {
      // 假设请求体是 JSON 格式
      print('Received data: $body');
      return Response.ok(jsonEncode({'message': 'Data received successfully', 'data': body}));
    } else if (body is String) {
      // 处理纯文本请求体
      print('Received text: $body');
      return Response.ok(jsonEncode({'message': 'Text received successfully', 'text': body}));
    } else {
      // 处理未知类型的请求体
      return Response.notAcceptable(body: 'Unsupported content type');
    }
  });

  var handler = createHandler(router);

  var server = await HttpServer.bind(InternetAddress.anyIPv4, 8080);
  print('Serving at http://${server.address.address}:${server.port}/');

  server.listen(handler);
}

在这个示例中,我们做了以下几件事:

  1. 引入必要的包:shelf 用于构建服务器,shelf_router 用于路由请求,belatuk_body_parser 用于解析请求体。
  2. 创建一个 BodyParser 实例。
  3. 设置一个路由,监听 /data 路径的 POST 请求。
  4. 在路由处理函数中,使用 parser.parseRequest(request) 来解析请求体。
  5. 根据请求体的类型(在这个例子中,我们检查了 Map<String, dynamic>String),返回相应的响应。
  6. 创建一个 HTTP 服务器并监听指定的端口。

这个示例展示了如何使用 belatuk_body_parser 来解析 JSON 和纯文本格式的请求体。根据你的需求,你可以扩展这个示例来处理更多类型的请求体或执行更复杂的逻辑。

请注意,虽然这个示例是在 Dart 后端环境中运行的,但了解如何在后端解析和处理 HTTP 请求体对于开发全栈应用是非常有帮助的。在 Flutter 客户端应用中,你通常会使用如 httpdio 这样的包来发送 HTTP 请求,而不需要直接解析请求体。

回到顶部