Flutter网络请求增强插件extended_http的使用

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

Flutter网络请求增强插件extended_http的使用

插件介绍

extended_http 是一个支持授权和缓存功能的Flutter HTTP包。它提供了多种API方法,如getpostputpatch等,并且可以配置多个API域名、存储认证数据、处理未授权请求、设置请求头、请求基URL、请求超时等。

安装依赖

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

dependencies:
  http: ^0.1.0
  hive: ^2.0.0
  extended_http: ^3.0.0

然后运行以下命令安装依赖:

flutter pub get

示例代码

下面是一个完整的示例代码,展示了如何使用extended_http进行网络请求并实现基本的授权和缓存功能。

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:extended_http/extended_http.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      homePage: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<Post> posts = [];

  Future<void> fetchPosts() async {
    final res = await ExtendedHttp().get(ExtendedHttp().createURI('/posts', params: {"_page": "1", "_limit": "1", "q": ""}));
    final data = jsonDecode(res.body) as List<dynamic>;
    setState(() {
      posts = data.map((e) => Post.fromJson(e)).toList();
    });
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    fetchPosts();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Post API'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            fetchPosts();
          },
          child: Text('Fetch Posts'),
        ),
      ),
    );
  }
}

class Post {
  static Future<List<Post>> getAll({
    int page = 1,
    int limit =  a,
    String search = '',
  }) async {
    final uri = ExtendedHttp().createURI('/posts', params: {
      "_page": "$page",
      "_limit": "$limit",
      "q": search,
    });
    final res = await ExtendedHttp().get(uri);
    final dataList = jsonDecode(res.body) as List<dynamic>;
    return dataList.map((e) => Post.fromJson(e)).toList();
  }

  static Future<Post> getDetail(int id) async {
    final uri = ExtendedHttp().createURI('/posts/$id');
    final res = await ExtendedHttp().get(uri);
    final data = jsonDecode(res.body) as Map<String, dynamic>;
    return Post.fromJson(data);
  }

  static Future<Post> create(Post newPost) async {
    final uri = ExtendedHttp().createURI('/posts');
    final res = await ExtendedHttp().post(
      uri,
      body: newPost.toJson(),
    );
    final data = jsonDecode(res.body) as Map<String, dynamic>;
    return Post.fromJson(data);
  }

  static Future<Post> update(Post post) async {
    final uri = ExtendedHttp().createURI('/posts/${post.id}');
    final res = await ExtendedHttp().put(
      uri,
      body: post.toJson()..remove('id'),
    );
    final data = jsonDecode(res.body) as Map<String, dynamic>;
    return Post.fromJson(data);
  }

  static Future<Post> delete(int id) async {
    final uri = ExtendedHttp().createURI('/posts/$id');
    final res = await ExtendedHttp().delete(uri);
    final data = jsonDecode(res.body) as Map<String, dynamic>;
    return Post.fromJson(data);
  }
}

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

1 回复

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


当然,关于extended_http这个Flutter插件的使用,下面是一个具体的代码案例,展示了如何利用它来进行网络请求。extended_http是一个增强版的HTTP请求库,它提供了更多的功能和配置选项,比如请求重试、拦截器等。

首先,确保你已经在pubspec.yaml文件中添加了extended_http依赖:

dependencies:
  flutter:
    sdk: flutter
  extended_http: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用extended_http进行网络请求:

  1. 导入依赖
import 'package:extended_http/extended_http.dart';
import 'package:dio/dio.dart';

注意,extended_http是基于dio库的,所以你需要同时导入dio

  1. 配置ExtendedHttp实例
class HttpClientService {
  final ExtendedHttp _extendedHttp;

  HttpClientService()
      : _extendedHttp = ExtendedHttp(
            dio: Dio(
              BaseOptions(
                baseUrl: 'https://api.example.com', // 替换为你的API基础URL
                connectTimeout: 10000,
                receiveTimeout: 10000,
              ),
            ),
            retryCount: 3, // 重试次数
            retryDelay: const Duration(seconds: 1), // 重试间隔
            errorHandler: (dioError, options) {
              // 自定义错误处理
              print('发生错误: ${dioError.message}');
              return null; // 返回null表示不进行默认的重试逻辑
            },
          );

  Future<dynamic> get(String path, {Map<String, dynamic>? queryParameters}) async {
    final Response<dynamic> response = await _extendedHttp.get(path, queryParameters: queryParameters);
    if (response.statusCode == 200) {
      return response.data;
    } else {
      throw Exception('请求失败,状态码: ${response.statusCode}');
    }
  }

  Future<dynamic> post(String path, {Map<String, dynamic>? data}) async {
    final Response<dynamic> response = await _extendedHttp.post(path, data: data);
    if (response.statusCode == 200 || response.statusCode == 201) {
      return response.data;
    } else {
      throw Exception('请求失败,状态码: ${response.statusCode}');
    }
  }
}
  1. 使用HttpClientService进行网络请求
void main() async {
  final httpClientService = HttpClientService();

  try {
    // 发起GET请求
    final getResponse = await httpClientService.get('endpoint/get');
    print('GET请求响应: $getResponse');

    // 发起POST请求
    final postResponse = await httpClientService.post('endpoint/post', data: {'key': 'value'});
    print('POST请求响应: $postResponse');
  } catch (e) {
    print('发生错误: $e');
  }
}

在这个例子中,我们创建了一个HttpClientService类来封装所有的HTTP请求。这个类内部使用ExtendedHttp实例来配置和管理HTTP请求,包括设置基础URL、连接超时、重试次数和自定义错误处理等。然后,我们提供了getpost方法来进行GET和POST请求,并在主函数中演示了如何使用这些方法。

请注意,这个示例代码只是一个基本的实现,你可能需要根据自己的项目需求进行进一步的定制和扩展。

回到顶部