Flutter网络通信插件rocket_client的使用

Flutter网络通信插件rocket_client的使用

Rocket Client 是一个 Dart 包,提供了简单易用的 HTTP 客户端。它基于 http 包,并提供了一些额外的功能,如处理 Rocket 模型、检查原始响应数据以及处理异常。

使用

创建一个 RocketClient 类的实例,并使用其 request 方法发送 HTTP 请求:

final rocket = RocketClient(url: 'https://jsonplaceholder.typicode.com');

final response = await rocket.request('posts', method: HttpMethods.get);

print(response);

你也可以通过向 request 方法提供一个 RocketModel 来自动处理响应数据:

final rocket = RocketClient(url: 'https://jsonplaceholder.typicode.com');

final post = Post();

await rocket.request('posts/1', model: post, method: HttpMethods.get);

print(post.toJson());

使用 sendFile 方法可以将文件发送到服务器:

final rocket = RocketClient(url: 'https://example.com');

final response = await rocket.sendFile('upload', files: {'file': '/path/to/my/file.jpg'});

print(response);

API 参考

RocketClient
RocketClient({required String url, Map<String, String> headers = const {}, bool setCookies = false})

创建一个新的 RocketClient 实例。

  • url: API 的基础 URL。
  • headers: 每个请求附加的额外头信息。
  • setCookies: 是否在后续请求中设置从服务器接收到的 Cookie。
Future<dynamic> request<T>(String endpoint, {RocketModel<T>? model, HttpMethods method = HttpMethods.get, RocketDataCallback? inspect, List<String>? targetData, Map<String, dynamic>? data, Map<String, dynamic>? params})

向指定的 endpoint 发送 HTTP 请求。

  • endpoint: 要发送请求的目标端点。
  • model: 用于处理响应数据的可选 RocketModel
  • method: 要使用的 HTTP 方法。
  • inspect: 用于检查原始响应数据的函数。
  • targetData: 用于从响应数据中提取嵌套 JSON 对象的关键字列表。
  • data: 请求正文,在发送前会被序列化为 JSON。
  • params: 要添加到 URL 的查询参数。

返回一个 Future,解析为响应数据(如果提供了 model 则返回处理后的数据,否则返回 JSON 或字符串)。

Future<dynamic> sendFile(String endpoint, {String id = “”, HttpMethods method = HttpMethods.post, Map<String, String>? fields, Map<String, String>? files})

向指定的 endpoint 发送文件或文件,并返回处理后的响应数据。

  • endpoint: 要发送文件的目标端点。
  • id: URL 中包含的可选 ID。
  • method: 要使用的 HTTP 方法。
  • fields: 与文件一起发送的其他字段。
  • files: 要发送的文件。

返回一个 Future,解析为处理后的响应数据。

HttpMethods

枚举表示 HTTP 方法。

  • get: GET 方法。
  • post: POST 方法。
  • put: PUT 方法。
  • delete: DELETE 方法。

示例代码

以下是一个完整的示例代码,展示了如何使用 RocketClient 发送 HTTP 请求并处理响应:

import 'dart:developer';

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:rocket_client/rocket_client.dart';
import 'package:rocket_model/rocket_model.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Rocket Client Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const RocketClientExample(),
    );
  }
}

class RocketClientExample extends StatefulWidget {
  const RocketClientExample({super.key});

  [@override](/user/override)
  RocketClientExampleState createState() => RocketClientExampleState();
}

class RocketClientExampleState extends State<RocketClientExample> {
  final client = RocketClient(
    url: 'https://dummyjson.com',
    globalRetryOptions: RetryOptions(
      retries: 5,
      retryWhen: (r) => r.statusCode != 200,
      onRetry: (p0, p1, p2) {
        log("Retry $p2");
      },
    ),
  );
  bool isLoading = false;
  bool isFailed = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Rocket Client Example'),
      ),
      body: Center(
        child: isLoading
            ? CircularProgressIndicator()
            : Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  ElevatedButton(
                    onPressed: () {
                      _makeRequest(context, "products");
                    },
                    child: const Text('Make Request'),
                  ),
                  ElevatedButton(
                    onPressed: () {
                      // 传递错误的端点以产生错误
                      _makeRequest(context, "productsss");
                    },
                    child: const Text('Make Failed Request'),
                  ),
                ],
              ),
      ),
    );
  }

  Future<void> _makeRequest(BuildContext context, String endpoint) async {
    isLoading = true;
    isFailed = false;
    setState(() {});

    // 发送 GET 请求到 /products 端点
    final RocketModel response = await client.request(
      endpoint,
      target: ['products'],
      retryOptions: RetryOptions(
        retries: 2,
        retryWhen: (r) => r.statusCode != 200,
      ),
      onError: (response, statusCode) {
        isFailed = true;
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
            content: Column(
          children: [
            const Text("Failed"),
            Text("response : $response & status code: $statusCode"),
          ],
        )));
      },
    );

    isLoading = false;
    setState(() {});

    // 在对话框中显示响应
    if (!isFailed) {
      showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: Text('Response : ${response.statusCode}'),
            content: Text(json.encode(response.apiResponse)),
            actions: [
              TextButton(
                onPressed: () {
                  Navigator.pop(context);
                },
                child: const Text('OK'),
              ),
            ],
          );
        },
      );
    }
  }
}

更多关于Flutter网络通信插件rocket_client的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络通信插件rocket_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用rocket_client插件进行网络通信的示例代码。rocket_client是一个用于与Rocket服务器进行通信的Flutter插件(请注意,rocket_client可能是一个假设的插件名称,实际使用中你需要根据具体插件的文档进行操作)。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加rocket_client插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  rocket_client: ^x.y.z  # 请替换为实际版本号

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

2. 导入插件

在你的Dart文件中导入rocket_client插件:

import 'package:rocket_client/rocket_client.dart';

3. 初始化并配置客户端

在你的应用中初始化并配置RocketClient

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Rocket Client Example'),
        ),
        body: RocketClientExample(),
      ),
    );
  }
}

class RocketClientExample extends StatefulWidget {
  @override
  _RocketClientExampleState createState() => _RocketClientExampleState();
}

class _RocketClientExampleState extends State<RocketClientExample> {
  RocketClient? _client;

  @override
  void initState() {
    super.initState();
    // 初始化RocketClient,配置URL等
    _client = RocketClient(
      baseUrl: 'https://your-rocket-server-url.com', // 替换为你的Rocket服务器URL
      headers: {
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN', // 如果需要身份验证,请添加相应的头部信息
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () async {
          if (_client != null) {
            try {
              // 发送GET请求
              var response = await _client!.get('/endpoint');
              print('GET response: ${response.data}');
            } catch (e) {
              print('Error: $e');
            }

            // 发送POST请求
            var postData = {
              'key1': 'value1',
              'key2': 'value2',
            };
            try {
              var postResponse = await _client!.post('/endpoint', data: postData);
              print('POST response: ${postResponse.data}');
            } catch (e) {
              print('Error: $e');
            }
          }
        },
        child: Text('Send Requests'),
      ),
    );
  }
}

4. 处理响应和错误

上面的示例中,我们处理了GET和POST请求,并打印了响应数据。在实际应用中,你可能需要根据响应数据更新UI或处理错误。

注意事项

  1. 错误处理:在生产环境中,请确保对网络请求进行适当的错误处理,如重试机制、用户通知等。
  2. 安全性:不要在代码中硬编码敏感信息(如API密钥、令牌等)。考虑使用环境变量或安全的存储方式。
  3. UI更新:如果你需要在UI中显示响应数据,请确保在UI线程(即主线程)上更新状态。

以上是一个使用rocket_client插件进行网络通信的基本示例。请根据你的实际需求和rocket_client插件的具体文档进行调整和扩展。

回到顶部