Dart原生HTTP库 - 鸿蒙Flutter网络请求基础场景
·





概述
在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 关键步骤解析
- 导入http包:使用
as http为包添加别名,避免命名冲突 - 构建Uri:使用
Uri.parse()将字符串转换为Uri对象 - 发送请求:调用
http.get()方法发送GET请求,返回Future<Response> - 检查状态码:通过
response.statusCode判断请求是否成功 - 处理响应体:通过
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请求,主要特点包括:
- 简单易用:API设计简洁,学习成本低
- 功能齐全:支持GET、POST、PUT、DELETE等HTTP方法
- 异步操作:基于Future实现,使用async/await语法
- 轻量级:没有过多依赖,适合简单的网络请求场景
对于复杂的网络请求场景(如拦截器、请求重试等),可以考虑使用第三方库如Dio。
参考资源
更多推荐



所有评论(0)