欢迎光临
我们一直在努力

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。


    参考资源

    • http包官方文档
    • HTTP状态码参考
    • Dart异步编程指南
    赞(0)
    未经允许不得转载:171主机测评 » Dart原生HTTP库 - 鸿蒙Flutter网络请求基础场景
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址