在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

概述

在Flutter开发中,网络请求是应用的核心功能之一。无论是获取天气数据、用户信息还是提交表单,都需要与服务器进行HTTP通信。Dart提供了官方的http包,这是一个轻量级、易于使用的HTTP客户端库。

本章将介绍如何使用Dart原生的http包进行网络请求,包括GET和POST请求、请求头配置、响应处理等基础操作。


1. 添加依赖

在使用http包之前,需要在项目的pubspec.yaml文件中添加依赖:

dependencies:
  http: ^1.2.0

添加后执行flutter pub get命令安装依赖。


2. 基本GET请求

GET请求是最常用的HTTP请求方式,用于从服务器获取数据。

2.1 简单示例

import 'package:http/http.dart' as http;

Future<void> fetchWeather() async {
  final response = await http.get(
    Uri.parse('https://api.example.com/weather?city=beijing'),
  );

  if (response.statusCode == 200) {
    print('请求成功: ${response.body}');
  } else {
    throw Exception('请求失败: ${response.statusCode}');
  }
}

2.2 关键步骤解析

  1. 导入http包:使用as http为包添加别名,避免命名冲突
  2. 构建Uri:使用Uri.parse()将字符串转换为Uri对象
  3. 发送请求:调用http.get()方法发送GET请求,返回Future<Response>
  4. 检查状态码:通过response.statusCode判断请求是否成功
  5. 处理响应体:通过response.body获取响应内容

3. 基本POST请求

POST请求用于向服务器提交数据,通常用于创建资源或提交表单。

3.1 JSON数据提交

import 'package:http/http.dart' as http;
import 'dart:convert';

Future<void> login() async {
  final response = await http.post(
    Uri.parse('https://api.example.com/login'),
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String, String>{
      'username': 'test',
      'password': '123456',
    }),
  );

  if (response.statusCode == 200) {
    print('登录成功');
  } else {
    throw Exception('登录失败');
  }
}

3.2 表单数据提交

Future<void> submitForm() async {
  final response = await http.post(
    Uri.parse('https://api.example.com/form'),
    body: <String, String>{
      'name': '张三',
      'email': 'zhangsan@example.com',
      'phone': '13800138000',
    },
  );
}

4. Uri构建方式

Uri是HTTP请求的统一资源标识符,正确构建Uri是发送请求的前提。

4.1 方式一:直接解析字符串

var url = Uri.parse('https://api.example.com/weather?city=beijing');

4.2 方式二:分步构建

var uri = Uri(
  scheme: 'https',
  host: 'api.example.com',
  path: '/weather',
  queryParameters: {'city': 'beijing', 'key': 'abc123'},
);
// 结果: https://api.example.com/weather?city=beijing&key=abc123

4.3 方式三:便捷构造函数

// HTTP协议
var httpUri = Uri.http('api.example.com', '/weather', {'city': 'shanghai'});

// HTTPS协议
var httpsUri = Uri.https('api.example.com', '/weather', {'city': 'shanghai'});

5. HTTP响应对象

http.get()http.post()方法返回的Response对象包含以下常用属性:

属性 类型 说明
statusCode int HTTP状态码,200表示成功
body String 响应体内容(字符串形式)
bodyBytes Uint8List 响应体内容(字节形式)
headers Map<String, String> 响应头信息
isRedirect bool 是否为重定向响应
contentLength int? 响应内容长度

5.1 状态码说明

HTTP状态码分为五类:

  • 1xx:信息响应(如100 Continue)
  • 2xx:成功响应(如200 OK)
  • 3xx:重定向(如301 Moved Permanently)
  • 4xx:客户端错误(如404 Not Found)
  • 5xx:服务器错误(如500 Internal Server Error)

6. 完整示例:天气查询

以下是一个完整的天气查询示例,展示了如何使用http包获取天气数据:

import 'package:http/http.dart' as http;
import 'dart:convert';

class WeatherService {
  final String baseUrl = 'https://api.openweathermap.org/data/2.5';
  final String apiKey = 'your_api_key';

  Future<Map<String, dynamic>> fetchWeather(String city) async {
    final uri = Uri.https(
      baseUrl,
      '/weather',
      {'q': city, 'appid': apiKey, 'units': 'metric'},
    );

    final response = await http.get(uri);

    if (response.statusCode == 200) {
      return jsonDecode(response.body);
    } else {
      throw Exception('获取天气失败: ${response.statusCode}');
    }
  }
}

void main() async {
  final service = WeatherService();
  try {
    final weather = await service.fetchWeather('Beijing');
    print('当前温度: ${weather['main']['temp']}°C');
    print('天气状况: ${weather['weather'][0]['description']}');
  } catch (e) {
    print('Error: $e');
  }
}

7. 注意事项

7.1 网络权限

在Android平台上,需要在AndroidManifest.xml中添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />

在iOS平台上,需要在Info.plist中添加网络访问权限。

7.2 HTTPS支持

建议使用HTTPS协议,确保数据传输安全。对于HTTP请求,需要在Android的AndroidManifest.xml中配置:

<application
    android:usesCleartextTraffic="true">
</application>

7.3 错误处理

网络请求可能会失败,需要进行适当的错误处理:

try {
  final response = await http.get(uri);
  // 处理响应
} catch (e) {
  // 网络错误
  print('网络请求失败: $e');
}

8. 总结

Dart原生的http包提供了简洁的API用于发送HTTP请求,主要特点包括:

  1. 简单易用:API设计简洁,学习成本低
  2. 功能齐全:支持GET、POST、PUT、DELETE等HTTP方法
  3. 异步操作:基于Future实现,使用async/await语法
  4. 轻量级:没有过多依赖,适合简单的网络请求场景

对于复杂的网络请求场景(如拦截器、请求重试等),可以考虑使用第三方库如Dio。


参考资源

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐