Flutter网络命令执行插件command_network的使用

Flutter网络命令执行插件command_network的使用

command_network 是一个基于 dio 的高级请求工具,灵感来源于 YTKNetwork

功能

  • 插件机制,处理请求的开始和结束。
  • 支持 HTTP 认证(Basic/Digest)。

开始使用

添加依赖

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

dependencies:
  command_network: ^0.0.1

简单示例

var api = GetUserInfoApi();
Result result = await api.start();
if (result.isSuccess) {
  print('[Result]success: ${result.data}');
} else {
  print('[Result]failed: ${result.error}');
}

使用说明

command_network 的基本组成

command_network 主要包含以下类:

  • NetworkConfig:用于设置全局网络主机地址。
  • BaseRequest:所有详细网络请求类的父类。所有网络请求类都应该继承它。每个 BaseRequest 的子类表示一个特定的网络请求。

NetworkConfig 类

功能

目前 NetworkConfig 的主要用途是:

  1. 设置全局网络主机地址。

设置全局网络主机地址

通过 NetworkConfig 设置全局网络主机地址,遵循“不要重复自己”的原则,我们只需要写一次主机地址。

在应用启动时设置 NetworkConfig 的属性,示例如下:

void main() {
  NetworkConfig().baseUrl = 'https://sample.com';
  runApp(const MyApp());
}

设置后,默认情况下所有网络请求都会使用 NetworkConfigbaseUrl 属性作为其主机地址。你也可以在请求实现中重写 baseUrl 方法以更改特定请求的主机地址。

BaseRequest 类

设计理念

BaseRequest 的设计理念是每个具体的网络请求应该是一个对象。因此,在使用 command_network 后,所有的请求类都应该继承 BaseRequest。通过重写父类的方法,你可以构建自己的具体且独特的请求。这一理念类似于命令模式。

示例

假设我们要向 https://sample.com/api/login 发送一个带有用户名和密码的 POST 请求,则类定义如下:

import 'dart:convert';

import 'package:crypto/crypto.dart';
import 'package:command_network/command_network.dart';

class LoginApi extends BaseRequest {
  LoginApi(this.username, this.password);

  final String username;
  final String password;

  @override
  HttpRequestMethod get requestMethod => HttpRequestMethod.post;

  @override
  Map<String, dynamic>? get requestArgument {
    var md5Password = md5.convert(utf8.encode(password));
    Map<String, dynamic> bodyMap = {};
    bodyMap['username'] = username;
    bodyMap['password'] = md5Password;
    return bodyMap;
  }

  @override
  String get requestUrl => 'api/login';
}

示例解析

  • 重写 requestUrl 方法:通过重写 requestUrl 方法,我们指定了详细的 URL。因为主机地址已经在 NetworkConfig 中设置了,所以我们不应该在 requestUrl 方法中写入主机地址。
  • 重写 requestMethod 方法:通过重写 requestMethod 方法,我们指定了使用 POST 方法。
  • 重写 requestArgument 方法:通过重写 requestArgument 方法,我们提供了 POST 请求的数据。

调用 LoginApi

如何使用 LoginApi?我们可以在登录页面调用它。初始化实例后,我们可以调用它的 start() 方法来发送请求。然后可以通过一个 Result 对象获取网络响应。

ElevatedButton(
  onPressed: () async {
    var loginApi = LoginApi('username', 'password');
    Result result = await loginApi.start();
    if (result.isSuccess) {
      print('[Result]success: ${result.data}');
    } else {
      print('[Result]failed: ${result.error}');
    }
  },
  child: const Text("Login"),
)

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

1 回复

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


command_network 是一个 Flutter 插件,用于在 Flutter 应用中执行网络命令。它允许你通过简单的 API 调用执行网络请求,并处理响应。以下是如何使用 command_network 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  command_network: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

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

import 'package:command_network/command_network.dart';

3. 执行网络请求

你可以使用 CommandNetwork 类来执行网络请求。以下是一个简单的 GET 请求示例:

void fetchData() async {
  try {
    var response = await CommandNetwork.get('https://jsonplaceholder.typicode.com/posts');
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  } catch (e) {
    print('Error: $e');
  }
}

4. 处理响应

CommandNetwork 返回的 response 对象包含以下属性:

  • statusCode: HTTP 状态码
  • body: 响应体(通常是 JSON 字符串)
  • headers: 响应头

你可以根据需要对响应进行处理。

5. 其他请求方法

CommandNetwork 还支持其他 HTTP 方法,如 POST、PUT、DELETE 等。以下是一个 POST 请求示例:

void postData() async {
  try {
    var response = await CommandNetwork.post(
      'https://jsonplaceholder.typicode.com/posts',
      body: {
        'title': 'foo',
        'body': 'bar',
        'userId': 1,
      },
    );
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  } catch (e) {
    print('Error: $e');
  }
}

6. 处理错误

在执行网络请求时,可能会遇到各种错误,如网络连接问题、服务器错误等。你可以使用 try-catch 块来捕获并处理这些错误。

7. 配置请求

CommandNetwork 还允许你配置请求头、超时时间等。以下是一个配置请求头的示例:

void fetchDataWithHeaders() async {
  try {
    var response = await CommandNetwork.get(
      'https://jsonplaceholder.typicode.com/posts',
      headers: {
        'Authorization': 'Bearer your_token_here',
      },
    );
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  } catch (e) {
    print('Error: $e');
  }
}

8. 使用 CommandNetwork 的实例

你也可以创建一个 CommandNetwork 的实例,以便在多个地方复用配置:

final network = CommandNetwork(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  headers: {
    'Authorization': 'Bearer your_token_here',
  },
);

void fetchDataWithInstance() async {
  try {
    var response = await network.get('/posts');
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  } catch (e) {
    print('Error: $e');
  }
}

9. 处理 JSON 数据

通常,网络请求返回的是 JSON 数据。你可以使用 dart:convert 库将 JSON 字符串解析为 Dart 对象:

import 'dart:convert';

void fetchAndParseJson() async {
  try {
    var response = await CommandNetwork.get('https://jsonplaceholder.typicode.com/posts');
    var jsonData = jsonDecode(response.body);
    print('Parsed JSON: $jsonData');
  } catch (e) {
    print('Error: $e');
  }
}
回到顶部