欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

前言

环境搭建完成后,第一个核心功能就是网络请求,这是所有数据类应用的基础。Flutter 鸿蒙端的网络请求和安卓端逻辑基本一致,但需要注意鸿蒙端的权限配置和库的兼容性问题,很多安卓端能用的库,在鸿蒙端需要做少量适配才能正常运行。

本文将完整记录 Flutter 鸿蒙应用的网络请求功能开发全流程,从 http 库选型、依赖引入、请求封装、接口实现到数据解析和测试,每一步都附带完整可复用的代码,全程以功能实现为核心,帮大家快速完成网络模块的开发。

一、http 库选型与依赖引入

Flutter 开发最常用的网络库是 dio,也是目前对鸿蒙端兼容性最好的网络库,功能完整、性能稳定,支持拦截器、取消请求、文件上传下载等所有常用功能。

1.1 依赖引入

在工程的依赖配置文件中添加 dio 库的依赖,推荐使用 5.0 + 的稳定版本,兼容性最好:

dependencies:
  flutter:
    sdk: flutter
  dio: ^5.4.0

添加完成后执行依赖拉取命令:

flutter pub get

1.2 网络权限配置

鸿蒙应用进行网络请求必须配置网络权限,在鸿蒙模块配置文件中添加网络访问权限,否则会出现请求失败的问题。

二、网络请求基础封装

为了方便后续使用和统一管理,我们对 dio 进行基础封装,统一配置基础地址、超时时间、请求头和拦截器。

2.1 基础配置类创建

创建网络请求配置类,统一配置全局参数:

import 'package:dio/dio.dart';

class HttpConfig {
  // 基础请求地址
  static const String baseUrl = "https://api.example.com";
  // 连接超时时间
  static const int connectTimeout = 10000;
  // 响应超时时间
  static const int receiveTimeout = 10000;
  // 通用请求头
  static const Map<String, dynamic> headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
  };
}

2.2 Dio 实例封装

创建单例的 Dio 实例,统一初始化配置:

class HttpRequest {
  static final HttpRequest _instance = HttpRequest._internal();
  factory HttpRequest() => _instance;
  late Dio _dio;

  HttpRequest._internal() {
    _dio = Dio(BaseOptions(
      baseUrl: HttpConfig.baseUrl,
      connectTimeout: const Duration(milliseconds: HttpConfig.connectTimeout),
      receiveTimeout: const Duration(milliseconds: HttpConfig.receiveTimeout),
      headers: HttpConfig.headers,
    ));
  }
}

三、GET 请求实现

GET 请求是最常用的请求方式,用于获取数据,我们封装通用的 GET 请求方法。

3.1 通用 GET 方法封装

在 HttpRequest 类中添加 GET 请求方法:

Future<Response> get(String url, {Map<String, dynamic>? params}) async {
  try {
    Response response = await _dio.get(url, queryParameters: params);
    return response;
  } catch (e) {
    rethrow;
  }
}

3.2 GET 请求使用示例

调用封装好的 GET 方法获取数据:

void getListData() async {
  try {
    Response response = await HttpRequest().get(
      "/list",
      params: {"page": 1, "size": 10},
    );
    print("请求成功:${response.data}");
  } catch (e) {
    print("请求失败:$e");
  }
}

四、POST 请求实现

POST 请求用于提交数据,比如表单提交、数据新增等场景。

4.1 通用 POST 方法封装

在 HttpRequest 类中添加 POST 请求方法:

Future<Response> post(String url, {Map<String, dynamic>? data}) async {
  try {
    Response response = await _dio.post(url, data: data);
    return response;
  } catch (e) {
    rethrow;
  }
}

4.2 POST 请求使用示例

调用封装好的 POST 方法提交数据:

void submitData() async {
  try {
    Response response = await HttpRequest().post(
      "/submit",
      data: {"name": "测试", "content": "提交内容"},
    );
    print("提交成功:${response.data}");
  } catch (e) {
    print("提交失败:$e");
  }
}

五、请求参数与头部配置

实际开发中经常需要动态配置请求头和参数,比如添加用户 token、自定义请求头等。

5.1 动态请求头配置

封装添加动态请求头的方法:

void setHeader(String key, String value) {
  _dio.options.headers[key] = value;
}

// 使用示例:添加用户token
void setUserToken(String token) {
  HttpRequest().setHeader("Authorization", "Bearer $token");
}

5.2 全局参数配置

添加全局公共参数,所有请求都会自动携带:

void addCommonParams(Map<String, dynamic> params) {
  _dio.options.queryParameters.addAll(params);
}

// 使用示例:添加全局设备信息
void addDeviceInfo() {
  HttpRequest().addCommonParams({
    "device": "harmony",
    "version": "1.0.0",
  });
}

六、响应数据解析

接口返回的 JSON 数据需要解析成实体类,方便后续使用。

6.1 基础响应实体类

创建通用的响应实体类,统一处理接口返回格式:

class BaseResponse {
  int code;
  String message;
  dynamic data;

  BaseResponse({
    required this.code,
    required this.message,
    required this.data,
  });

  factory BaseResponse.fromJson(Map<String, dynamic> json) {
    return BaseResponse(
      code: json["code"],
      message: json["message"],
      data: json["data"],
    );
  }
}

6.2 响应数据解析示例

将接口返回的数据解析成实体类:

void parseResponseData(Response response) {
  BaseResponse baseResponse = BaseResponse.fromJson(response.data);
  if (baseResponse.code == 200) {
    print("请求成功,数据:${baseResponse.data}");
  } else {
    print("请求失败:${baseResponse.message}");
  }
}

七、真机网络测试

功能开发完成后,需要在真机上进行测试,验证网络请求是否正常。

7.1 测试接口准备

使用公开的测试接口进行验证,比如获取公开的列表数据接口:

void testNetwork() async {
  try {
    Response response = await HttpRequest().get(
      "https://jsonplaceholder.typicode.com/posts",
      params: {"_limit": 5},
    );
    print("测试成功,返回数据条数:${response.data.length}");
  } catch (e) {
    print("测试失败:$e");
  }
}

7.2 测试验证步骤

  1. 重新编译应用安装到真机
  2. 触发网络请求,查看日志输出
  3. 验证数据返回正常,没有报错
  4. 测试无网络场景下的异常处理

测试正常即代表网络模块开发完成。

八、网络功能开发总结

Flutter 鸿蒙端的网络功能开发和安卓端基本一致,核心注意点总结如下:

  1. 优先使用 dio 库,是目前对鸿蒙端兼容性最好的网络库
  2. 一定要提前配置网络权限,否则所有请求都会失败
  3. 建议对网络请求进行统一封装,方便后续维护和扩展
  4. 统一处理响应格式和异常,避免每个接口重复写逻辑
  5. 所有功能开发完成后一定要在真机上测试,不要只在模拟器上验证

网络模块是所有应用的基础,封装好之后后续的业务功能开发就会非常顺畅。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐