Flutter网络请求插件iw_rest_client的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter网络请求插件iw_rest_client的使用

本项目旨在实现一个封装HTTP客户端的解决方案,允许开发者在其应用中直接使用。其主要目标是创建一个封装了HTTP客户端的包,以便开发者在多个应用中使用,而无需为每个项目重复创建自己的封装。

目前,该包仅支持Dart自带的HTTP客户端。未来可能会支持其他客户端,例如Dio HTTP客户端。

使用方法

以下是一个使用iw_rest_client插件进行HTTP请求的示例,包括如何处理REST异常。

你也可以阅读单元测试来了解所有支持的功能。

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

import 'package:iw_rest_client/iw_rest_client.dart';

Future<void> main() async {
  try {
    // 创建一个HTTP客户端服务实例
    final RestClientService service = HttpClientService();

    // 遍历所有HTTP方法
    for (var method in RestMethod.values) {
      final RestResponse response = switch (method) {
        // GET 请求
        RestMethod.get => await service.fetch(
            method: RestMethod.get,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/todos/1',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
          ),
        // POST 请求
        RestMethod.post => await service.fetch(
            method: RestMethod.post,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/posts',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
            body: jsonEncode({
              'title': 'foo',
              'body': 'bar',
              'userId': 1,
            }),
            encoding: Encoding.getByName('UTF-8'),
          ),
        // PUT 请求
        RestMethod.put => await service.fetch(
            method: RestMethod.put,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/posts/1',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
            body: jsonEncode({
              'id': 1,
              'title': 'foo',
              'body': 'bar',
              'userId': 1,
            }),
            encoding: Encoding.getByName('UTF-8'),
          ),
        // PATCH 请求
        RestMethod.patch => await service.fetch(
            method: RestMethod.patch,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/posts/1',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
            body: jsonEncode({
              'title': 'foo',
            }),
            encoding: Encoding.getByName('UTF-8'),
          ),
        // DELETE 请求
        RestMethod.delete => await service.fetch(
            method: RestMethod.delete,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/posts/1',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
          ),
      };

      // 打印请求结果
      print('$method: $response');
    }

    // 正常退出
    exit(0);
  } on RestException catch (error) {
    // 处理 REST 异常
    print('Error [$error]');
    exit(1);
  } catch (error) {
    // 处理其他异常
    print('Unhandled error [$error]');
    exit(2);
  }
}

完整示例代码

以下是从GitHub上获取的示例代码:

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

import 'package:iw_rest_client/iw_rest_client.dart';

Future<void> main() async {
  try {
    // 创建一个HTTP客户端服务实例
    final RestClientService service = HttpClientService();

    // 遍历所有HTTP方法
    for (var method in RestMethod.values) {
      final RestResponse response = switch (method) {
        // GET 请求
        RestMethod.get => await service.fetch(
            method: RestMethod.get,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/todos/1',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
          ),
        // POST 请求
        RestMethod.post => await service.fetch(
            method: RestMethod.post,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/posts',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
            body: jsonEncode({
              'title': 'foo',
              'body': 'bar',
              'userId': 1,
            }),
            encoding: Encoding.getByName('UTF-8'),
          ),
        // PUT 请求
        RestMethod.put => await service.fetch(
            method: RestMethod.put,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/posts/1',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
            body: jsonEncode({
              'id': 1,
              'title': 'foo',
              'body': 'bar',
              'userId': 1,
            }),
            encoding: Encoding.getByName('UTF-8'),
          ),
        // PATCH 请求
        RestMethod.patch => await service.fetch(
            method: RestMethod.patch,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/posts/1',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
            body: jsonEncode({
              'title': 'foo',
            }),
            encoding: Encoding.getByName('UTF-8'),
          ),
        // DELETE 请求
        RestMethod.delete => await service.fetch(
            method: RestMethod.delete,
            uri: RestUri(
              scheme: RestScheme.https,
              host: 'jsonplaceholder.typicode.com',
              path: '/posts/1',
            ),
            headers: {
              'Content-Type': 'application/json',
            },
          ),
      };

      // 打印请求结果
      print('$method: $response');
    }

    // 正常退出
    exit(0);
  } on RestException catch (error) {
    // 处理 REST 异常
    print('Error [$error]');
    exit(1);
  } catch (error) {
    // 处理其他异常
    print('Unhandled error [$error]');
    exit(2);
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用iw_rest_client插件进行网络请求的示例代码。iw_rest_client是一个Flutter插件,用于简化HTTP请求的处理。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  iw_rest_client: ^最新版本号  # 请替换为实际的最新版本号

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

2. 配置网络请求

接下来,在你的Flutter项目中配置iw_rest_client。假设你需要发送一个GET请求。

创建API服务类

你可以创建一个API服务类来封装所有的网络请求。

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

class ApiService {
  final RestClient _client = RestClient(
    baseUrl: 'https://api.example.com', // 替换为你的API基础URL
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      // 添加其他必要的头信息
    },
  );

  Future<Map<String, dynamic>> fetchData() async {
    try {
      final response = await _client.get(
        path: '/endpoint', // 替换为你的API路径
        params: {
          'param1': 'value1', // 替换为你的请求参数
          'param2': 'value2',
        },
      );

      if (response.isSuccessful) {
        return response.data;
      } else {
        throw Exception('请求失败: ${response.statusCode}');
      }
    } catch (e) {
      throw Exception('发生错误: $e');
    }
  }
}

使用API服务类

然后,你可以在你的UI组件中使用这个API服务类来获取数据。

import 'package:flutter/material.dart';
import 'api_service.dart'; // 导入你创建的API服务类

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Network Request'),
        ),
        body: DataFetcher(),
      ),
    );
  }
}

class DataFetcher extends StatefulWidget {
  @override
  _DataFetcherState createState() => _DataFetcherState();
}

class _DataFetcherState extends State<DataFetcher> {
  Future<Map<String, dynamic>>? futureData;
  final ApiService apiService = ApiService();

  @override
  void initState() {
    super.initState();
    futureData = apiService.fetchData();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<Map<String, dynamic>>(
      future: futureData,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          if (snapshot.hasError) {
            return Center(
              child: Text('请求失败: ${snapshot.error}'),
            );
          } else if (snapshot.hasData) {
            final data = snapshot.data!;
            // 在这里处理你的数据
            return ListView.builder(
              itemCount: data.length, // 假设数据是一个列表
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text('${data.keys.elementAt(index)}: ${data.values.elementAt(index)}'),
                );
              },
            );
          } else {
            return Center(child: CircularProgressIndicator());
          }
        } else {
          return Center(child: CircularProgressIndicator());
        }
      },
    );
  }
}

3. 运行应用

现在,你可以运行你的Flutter应用,并查看网络请求的结果。

这个示例展示了如何使用iw_rest_client插件发送一个GET请求,并在UI中显示请求结果。你可以根据需要扩展这个示例,以处理POST、PUT、DELETE等其他类型的HTTP请求。

回到顶部