Flutter网络请求插件network_y的使用

Flutter网络请求插件network_y的使用

网络_y 🌐

network_y 是一个在 Dart 和 Flutter 应用程序中处理网络相关操作的简单且灵活的抽象层。它提供了一个清晰的接口来发起 HTTP 请求、管理响应并处理错误,使得与不同 HTTP 客户端的集成变得容易。🚀

快速开始

以下是一个简单的示例,帮助你快速上手 network_y

// 定义你的请求
class GetUserRequest extends GetRequest {
  GetUserRequest(int userId) : super(
    baseUrl: 'https://api.example.com',
    endpoint: '/users/$userId',
  );
}

// 设置客户端
final apiClient = ApiClient(apiExecutor: DioApiExecutor());

// 发起请求
final result = await apiClient<Map<String, Object?>>(GetUserRequest(1));

// 处理结果
result.fold(
  onSuccess: (data) => print('User data: $data'),
  onFailure: (error) => print('Error: ${error.userFriendlyMessage}'),
);

这个简单的示例展示了如何定义请求、设置客户端、发起调用以及处理结果。

关键组件

classDiagram
    class ApiClient {
        +ApiExecutor executor
        +call(Request) AsyncResult
    }
    class ApiExecutor {
        <<interface>>
        +get(Request) AsyncResult
        +post(Request) AsyncResult
        +patch(Request) AsyncResult
        +setUp(SetupRequest)
    }
    class Request {
        <<abstract>>
        +String baseUrl
        +String endpoint
        +Headers headers
        +QueryParameters queryParameters
        +Duration timeout
    }
    class GetRequest {
        <<interface>>
    }
    class PostRequest {
        <<interface>>
        +Payload body
    }
    class PatchRequest {
        <<interface>>
        +Payload body
    }
    class DioApiExecutor {
        +get(Request) AsyncResult
        +post(Request) AsyncResult
        +patch(Request) AsyncResult
        +setUp(SetupRequest)
    }
    class Result {
        <<abstract>>
    }
    class Success {
        +value
    }
    class Failure {
        +ApiException error
    }

    ApiClient -->> ApiExecutor
    ApiExecutor <|.. DioApiExecutor
    ApiClient -->> Request
    Request <|-- GetRequest
    Request <|-- PostRequest
    Request <|-- PatchRequest
    ApiClient -->> Result
    Result <|-- Success
    Result <|-- Failure

ApiExecutor 🔧

ApiExecutor 负责实际的网络请求。内部它可以使用各种 HTTP 客户端包,如 diohttp 等。这种设计的优点在于你可以轻松地在不同的执行器之间切换而无需更改应用程序代码。

ApiClient 🖥️

ApiClient 是你用来发起网络请求的主要类。它接受一个 ApiExecutor 作为参数,允许你轻松地在不同的网络实现之间切换。

final apiClient = ApiClient(apiExecutor: DioApiExecutor());

这种设计使得更改底层 HTTP 客户端或为测试模拟网络请求变得简单。

如何使用

请求类型

  • GetRequest:用于 GET 请求 📥
  • PostRequest:用于带有主体的 POST 请求 📤
  • PatchRequest:用于带有主体的 PATCH 请求 🔄

ApiException

一个全面的异常类,提供了有关网络错误的详细信息。🚨

示例

发起GET请求

class UserGetRequest extends GetRequest {
  UserGetRequest({required int userId})
      : super(
          baseUrl: 'https://api.example.com',
          endpoint: '/users/$userId',
        );
}

final request = UserGetRequest(userId: 1);
final result = await apiClient.call<Map<String, Object?>>(request);

result.fold(
  onSuccess: (data) => print('User data: $data'),
  onFailure: (error) => print('Error: ${error.userFriendlyMessage}'),
);

发起POST请求

class CreateUserRequest extends PostRequest {
  CreateUserRequest({required String name, required String email})
      : super(
          baseUrl: 'https://api.example.com',
          endpoint: '/users',
          body: {'name': name, 'email': email},
        );
}

final request = CreateUserRequest(name: 'John Doe', email: 'john@example.com');
final result = await apiClient.call<Map<String, Object?>>(request);

result.fold(
  onSuccess: (data) => print('User created: $data'),
  onFailure: (error) => print('Error: ${error.userFriendlyMessage}'),
);

使用基础请求

在许多应用中,你可能会有一些通用参数(如基础 URL、头等)在多个请求中共享。与其将这些参数传递给每个请求,你可以创建一个基础请求,并让其他所有请求扩展它。以下是示例:

class BaseApiRequest extends Request {
  BaseApiRequest({
    required super.endpoint,
    super.baseUrl = 'https://api.example.com/',
    super.headers = const {
      'Content-Type': 'application/json',
      'Api-Version': 'v1',
    },
  });
}

class GetUserRequest extends BaseApiRequest implements GetRequest {
  GetUserRequest({
    required this.userId,
  }) : super(
          endpoint: 'users/$userId',
        );

  final String userId;
}

class CreatePostRequest extends BaseApiRequest implements PostRequest {
  CreatePostRequest({
    required this.title,
    required this.content,
    required this.authorId,
  }) : super(
          endpoint: 'posts',
        );

  final String title;
  final String content;
  final String authorId;

  @override
  Payload get body => {
        'title': title,
        'content': content,
        'author_id': authorId,
      };
}

这种方法允许你集中配置公共参数,并轻松地为不同的端点创建特定请求。BaseApiRequest 设置了通用参数,如基础 URL 和默认头,而具体的请求类(如 GetUserRequestCreatePostRequest)扩展此基础类并添加自己的独特属性和行为。

动态头部

在某些情况下,你在定义基础请求时可能无法访问某些头值(如身份验证令牌)。network_y 包允许你通过 ApiExecutorsetUp 方法动态添加这些头。以下是具体做法:

final apiExecutor = DioApiExecutor();

// 在设置期间添加动态头
apiExecutor.setUp(
  request: (
    headers: {
      'Authorization': 'Bearer ${getAuthToken()}',
      'Custom-Header': 'Some-Value',
    },
  ),
);

final apiClient = ApiClient(apiExecutor: apiExecutor);

这种方法允许你添加或更新那些可能不可用或频繁变化的头值,例如身份验证令牌或会话特定信息。这些头将应用于通过 apiClient 发起的所有请求,除了你在基础请求类或特定请求类中定义的头之外。

入门 🏁

  1. 将包添加到你的 pubspec.yaml 文件中:
dependencies:
  network_y: ^0.0.4+3
  1. 在你的 Dart 代码中导入该包:
import 'package:network_y/network_y.dart';

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用network_y(假设这是一个虚构的网络请求插件,因为实际上并没有一个名为network_y的流行插件,通常我们会使用diohttp等插件)进行网络请求的示例代码。为了示范,我会模拟一个类似的插件使用方式,并给出相关的代码案例。

首先,假设network_y插件的基本使用方法与diohttp类似,并且提供了GET和POST请求的方法。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加network_y的依赖(这里仅为示例,实际中需要替换为真实存在的插件):

dependencies:
  flutter:
    sdk: flutter
  network_y: ^1.0.0  # 假设版本号

2. 导入插件

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

import 'package:network_y/network_y.dart';

3. 初始化并配置

假设network_y需要初始化,并配置一些基础设置,比如基础URL:

void main() {
  // 初始化network_y
  NetworkY.instance.baseUrl = 'https://api.example.com';
  
  runApp(MyApp());
}

4. 发送GET请求

下面是一个发送GET请求的示例:

import 'package:flutter/material.dart';
import 'package:network_y/network_y.dart';

void fetchData() async {
  try {
    var response = await NetworkY.instance.get('/endpoint');
    print('Response Data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('NetworkY Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: fetchData,
            child: Text('Fetch Data'),
          ),
        ),
      ),
    );
  }
}

5. 发送POST请求

下面是一个发送POST请求的示例,假设我们需要发送一些JSON数据:

void postData() async {
  var body = {
    'key1': 'value1',
    'key2': 'value2',
  };

  try {
    var response = await NetworkY.instance.post('/endpoint', data: body);
    print('Response Data: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

// 在MyApp的Scaffold中添加另一个按钮用于POST请求
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('NetworkY Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: fetchData,
                child: Text('Fetch Data'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: postData,
                child: Text('Post Data'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  • 由于network_y是一个虚构的插件,所以上述代码仅为示例,实际使用时请替换为真实存在的插件,如diohttp
  • 在真实项目中,网络请求通常需要处理更多的异常情况,比如网络错误、超时、请求取消等。
  • 确保你的API端点URL和请求数据格式正确。

希望这个示例能帮助你理解如何在Flutter中使用网络请求插件。如果你使用的是其他真实存在的插件,如diohttp,请参考它们的官方文档进行配置和使用。

回到顶部