Flutter開發實戰之網絡請求與數據處理

第6章:網絡請求與數據處理

“數據是應用的血液,網絡是連接世界的橋梁。”

在移動應用開發中,與服務器進行數據交互是必不可少的功能。無論是獲取用戶信息、提交表單數據,還是上傳圖片、下載文件,都離不開網絡請求。本章將帶你深入掌握Flutter中的網絡編程技巧。

6.1 網絡請求基礎概念

6.1.1 什么是HTTP請求?

想象一下,你走進一家餐廳點餐的過程:

  1. 你告訴服務員想要什么(發送請求)
  2. 服務員把你的需求傳達給廚房(請求到達服務器)
  3. 廚房準備你的餐點(服務器處理請求)
  4. 服務員把餐點端給你(接收響應)

HTTP請求就是這樣一個過程,只不過是應用與服務器之間的"點餐"過程。

6.1.2 常見的HTTP方法

// GET:獲取數據,就像詢問菜單
// POST:提交數據,就像下訂單
// PUT:更新數據,就像修改訂單
// DELETE:刪除數據,就像取消訂單
// PATCH:部分更新,就像只修改訂單中的某個菜品

6.2 HTTP請求的封裝與配置

6.2.1 使用原生http庫

Flutter提供了基礎的http庫,但直接使用會讓代碼變得復雜:

import 'package:http/http.dart' as http;
import 'dart:convert';class BasicHttpClient {static const String baseUrl = 'https://api.example.com';// 基礎GET請求static Future<Map<String, dynamic>> get(String endpoint) async {try {final response = await http.get(Uri.parse('$baseUrl$endpoint'),headers: {'Content-Type': 'application/json','Accept': 'application/json',},);if (response.statusCode == 200) {return json.decode(response.body);} else {throw Exception('請求失敗: ${response.statusCode}');}} catch (e) {throw Exception('網絡錯誤: $e');}}
}

6.2.2 為什么選擇dio庫?

dio庫就像是一個功能強大的"網絡請求管家",它幫我們處理了很多繁瑣的工作:

  • 更簡潔的API:寫更少的代碼做更多的事
  • 強大的攔截器:統一處理請求和響應
  • 自動錯誤處理:智能的錯誤重試機制
  • 文件操作支持:輕松上傳下載文件
  • 請求取消:避免內存泄漏
  • 緩存支持:提升用戶體驗

6.3 dio庫的高級用法

6.3.1 dio的基本配置

import 'package:dio/dio.dart';class HttpClient {static late Dio _dio;// 初始化dio實例static void init() {_dio = Dio(BaseOptions(baseUrl: 'https://api.example.com',connectTimeout: const Duration(seconds: 10),receiveTimeout: const Duration(seconds: 10),sendTimeout: const Duration(seconds: 10),headers: {'Content-Type': 'application/json','Accept': 'application/json',},));_setupInterceptors();}static Dio get dio => _dio;
}

6.3.2 創建一個優雅的網絡請求封裝類

class ApiClient {late Dio _dio;ApiClient() {_dio = Dio();_setupDio();}void _setupDio() {_dio.options = BaseOptions(baseUrl: 'https://jsonplaceholder.typicode.com',connectTimeout: const Duration(seconds: 10),receiveTimeout: const Duration(seconds: 10),headers: {'Content-Type': 'application/json',},);}// 通用請求方法Future<T> request<T>(String path, {String method = 'GET',Map<String, dynamic>? queryParameters,dynamic data,Map<String, dynamic>? headers,required T Function(dynamic) fromJson,}) async {try {final options = Options(method: method,headers: headers,);final response = await _dio.request(path,queryParameters: queryParameters,data: data,options: options,);return fromJson(response.data);} on DioException catch (e) {throw _handleDioError(e);}}// 錯誤處理String _handleDioError(DioException e) {switch (e.type) {case DioExceptionType.connectionTimeout:return '連接超時,請檢查網絡';case DioExceptionType.receiveTimeout:return '接收數據超時,請重試';case DioExceptionType.badResponse:return '服務器錯誤:${e.response?.statusCode}';case DioExceptionType.cancel:return '請求已取消';default:return '網絡錯誤:${e.message}';}}
}

6.4 RESTful API接口調用

6.4.1 理解RESTful API

RESTful API就像是一套標準的"服務規范":

  • 資源導向:把數據看作資源,每個資源都有唯一的URL
  • HTTP方法語義化:用不同的HTTP方法表示不同的操作
  • 狀態碼標準化:用HTTP狀態碼表示操作結果

6.4.2 實現完整的CRUD操作

class UserService {final ApiClient _apiClient = ApiClient();// 獲取用戶列表 (GET)Future<List<User>> getUsers() async {return await _apiClient.request<List<User>>('/users',fromJson: (data) => (data as List).map((item) => User.fromJson(item)).toList(),);}// 獲取單個用戶 (GET)Future<User> getUser(int id) async {return await _apiClient.request<User>('/users/$id',fromJson: (data) => User.fromJson(data),);}// 創建用戶 (POST)Future<User> createUser(User user) async {return await _apiClient.request<User>('/users',method: 'POST',data: user.toJson(),fromJson: (data) => User.fromJson(data),);}// 更新用戶 (PUT)Future<User> updateUser(int id, User user) async {return await _apiClient.request<User>('/users/$id',method: 'PUT',data: user.toJson(),fromJson: (data) => User.fromJson(data),);}// 刪除用戶 (DELETE)Future<void> deleteUser(int id) async {await _apiClient.request<void>('/users/$id',method: 'DELETE',fromJson: (data) => null,);}
}

6.5 JSON數據序列化與反序列化

6.5.1 理解JSON序列化

JSON序列化就像是"翻譯官"的工作:

  • 序列化:把Dart對象翻譯成JSON字符串,方便網絡傳輸
  • 反序列化:把JSON字符串翻譯回Dart對象,方便程序使用

6.5.2 手動序列化(適合簡單場景)

class User {final int id;final String name;final String email;final String? avatar;User({required this.id,required this.name,required this.email,this.avatar,});// 從JSON創建對象(反序列化)factory User.fromJson(Map<String, dynamic> json) {return User(id: json['id'] as int,name: json['name'] as String,email: json['email'] as String,avatar: json['avatar'] as String?,);}// 轉換為JSON(序列化)Map<String, dynamic> toJson() {return {'id': id,'name': name,'email': email,if (avatar != null) 'avatar': avatar,};}String toString() {return 'User{id: $id, name: $name, email: $email}';}
}

6.5.3 使用json_annotation(推薦方式)

首先添加依賴:

dependencies:json_annotation: ^4.8.1dev_dependencies:json_serializable: ^6.7.1build_runner: ^2.4.7

然后創建模型類:

import 'package:json_annotation/json_annotation.dart';part 'user.g.dart';()
class User {final int id;final String name;final String email;(name: 'avatar_url')final String? avatarUrl;(name: 'created_at')final DateTime? createdAt;User({required this.id,required this.name,required this.email,this.avatarUrl,this.createdAt,});factory User.fromJson(Map<String, dynamic> json) =&

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93553.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快速分頁實現熱點功能-索引和order by

需求:分頁求出進三天的發布視頻的權重熱度 權重 / 衰減時間 衰減時間 當前時間 - 視頻發布時間 小根堆來實現這個公式可以很好的利用半衰期來進行解決難點:如果一次性加載太多到springBoot服務器里面會造成堆內存占用過多&#xff0c;分頁又有可能造成深分頁問題&#xff0c;…

HAProxy(高可用性代理)

1 HAProxy 簡介 HAProxy&#xff08; High Availability Proxy&#xff09;是一個高性能的負載均衡器和代理服務器&#xff0c;為基于 TCP 和 HTTP 的應用程序提供高可用性、負載平衡和代理&#xff0c;廣泛應用于提高 web 應用程序的性能和可靠性。它支持多種協議&#xff0c…

Vulnhub靶場:ica1

一、信息收集nmap掃描一下IP。&#xff08;掃不出來的可以看一下前面幾篇找ip的步驟&#xff09;下面給了框架的版本是9.2的&#xff0c;我們去kali里搜一下有沒有已經公開的漏洞。searchsploit qdPM 9.2 locate 50176.txt more /usr/share/exploitdb/exploits/php/webapps/50…

【Dv3admin】ORM數據庫無法查詢的問題

Django 運行過程中&#xff0c;數據庫連接的健康狀態直接影響應用的穩定性和數據訪問準確性。長時間空閑的數據庫連接經常因外部機制被回收&#xff0c;進而引發數據查詢異常和返回無效結果。 本文圍繞 Django 中數據庫連接長時間空閑導致的連接失效問題&#xff0c;介紹相關的…

使用 Flownex 對機械呼吸機進行建模

當患者無法獨立呼吸時&#xff0c;機械呼吸機通過氣管插管將富氧空氣輸送到患者的肺部。肺是敏感而復雜的器官&#xff0c;因此在無法忍受的壓力和體積范圍內提供空氣&#xff0c;根據每分鐘所需的呼吸次數計時&#xff0c;并適當加濕和加熱。機械呼吸機的精確建模對于其安全有…

力扣刷題日常(7-8)

力扣刷題日常(7-8) 第7題: 整數反轉(難度: 中等) 原題: 給你一個 32 位的有符號整數 x ,返回將 x 中的數字部分反轉后的結果. 如果反轉后整數超過 32 位的有符號整數的范圍 [?231, 231 ? 1] ,就返回 0. 假設環境不允許存儲 64 位整數&#xff08;有符號或無符號&#xff09;.…

串口接收數據包(協議帶幀頭幀尾)的編程實現方法:1、數據包格式定義結構體2、使用隊列進行數據接收、校驗解包

這種帶幀頭幀尾的數據包處理流程可以簡單概括為 “識別邊界→提取有效數據→驗證完整性” 三個核心步驟&#xff0c;具體操作如下&#xff1a;1. 數據包格式定義&#xff08;先約定規則&#xff09;首先明確一個 “合格數據包” 的結構&#xff0c;比如&#xff1a; 幀頭&#…

JSON 對象封裝教程

JSON 對象封裝方法在 Java 中封裝 JSON 對象通常使用第三方庫&#xff0c;如 org.json、Gson 或 Jackson。以下是幾種常見的方法&#xff1a;使用 org.json 庫添加 Maven 依賴&#xff1a;<dependency><groupId>org.json</groupId><artifactId>json<…

【WRF-Chem】EDGAR 排放數據處理:分部門合并轉化為二進制(Python全代碼)

目錄 process.py process_biofl.py process_fossil.py process_micro.py process_sector.py 參考 process.py 讀取 EDGAR 排放數據庫中 2000 至 2023 年間不同行業的甲烷(CH?)排放數據,進行合并處理,并將總排放以二進制格式保存到文件中。 導入必要的庫 import numpy as n…

【學習過程記錄】【czsc】1、安裝

文章目錄 背景 安裝 安裝python 安裝czsc 功能測試 附錄 奇葩的報錯 背景 詳見: https://github.com/waditu/czsc 安裝 安裝python !重要!作者強調,python必須是大于等于3.8 為此呢,我也是花了一點時間裝了一個python3.13。 安裝czsc 關于czsc的安裝呢,官方也是給出…

Python批量生成N天前的多word個文件,并根據excel統計數據,修改word模板,合并多個word文件

1&#xff0c;需求 根據word模板文件&#xff0c;生成多個帶日期后綴的word文件根據excel-每日告警統計數量&#xff0c;逐個修改當日的文檔2&#xff0c;實現 shell腳本&#xff1a;根據word模板文件&#xff0c;生成多個帶日期后綴的word文件 #!/bin/bash # 生成近一年日期 …

基于uni-app的血糖血壓刻度滑動控件

想要做一個基于uni-app的血糖血壓刻度滑動控件&#xff0c;hbuilder市場沒有好的&#xff0c;參照別人的寫了一個。如圖&#xff1a;源碼&#xff0c;自己放入components里面。<!-- 刻度滑動選擇 --> <template><view><view class"slide-title"…

C語言(02)——標準庫函數大全(持續更新)

想要了解更多的C語言知識&#xff0c;可以訂閱下面的專欄&#xff0c;里面也有很多品質好文&#xff1a; 打怪升級之路——C語言之路_ankleless的博客-CSDN博客 還在持續更新中&#xff0c;以下是學習過程中遇到的一些庫函數&#xff08;排序不分先后&#xff09;&#xff1a…

永磁同步電機無速度算法--靜態補償電壓模型Harnefors觀測器

一、原理介紹本文基于Harnefors教授提出的靜態補償電壓模型&#xff0c;可以實現帶載零速啟動、正反轉切換等功能&#xff0c;原理清晰&#xff0c;實現簡便。二、仿真模型在MATLAB/simulink里面驗證所提算法&#xff0c;搭建仿真。采用和實驗中一致的控制周期1e-4&#xff0c;…

[SKE]Python gmssl庫的C綁定

Python gmssl庫的C綁定 摘要:本文展示gmssl庫的C綁定,并給出完整代碼。將參考模型從Python腳本遷移到純C代碼中使用gmssl庫(TongSuo項目,支持國密算法如SM4,同時兼容AES、DES、3DES、RSA等)。這樣,UVM(SystemVerilog)可以通過DPI-C直接調用C函數,而無需嵌入Py…

4.方法的使用

方法是指一段具有獨立功能的代碼塊&#xff0c;只有被調用時才會執行方法的主要作用體現在&#xff1a;代碼組織&#xff1a;將原本擠在一起的臃腫代碼按照功能進行分類管理例如&#xff1a;將用戶注冊的驗證邏輯、數據庫操作、結果返回等分離成不同方法提高復用性&#xff1a;…

day21-Excel文件解析

目錄 1. 概述 2. Apache POI 3. XSSF解析Excel文件 3.1. 添加Jar包依賴 3.2. Workbook&#xff08;Excel文件&#xff09; 3.2.2. 加載&#xff08;解析&#xff09;Excel文件 3.3. Sheet &#xff08;工作簿&#xff09; 3.3.1. 創建工作簿 3.3.2. 獲取工作簿 3.3.3.…

與 TRON (波場) 區塊鏈進行交互的命令行工具 (CLI): tstroncli

源碼倉庫 一個基于 Node.js 和 TypeScript 構建的&#xff0c;用于與 TRON (波場) 區塊鏈進行交互的命令行工具 (CLI)。 本項目旨在提供一個簡單、可擴展的框架&#xff0c;讓開發者可以輕松地通過命令行調用 TRON 的 HTTP API&#xff0c;實現查詢鏈上信息、發送交易等操作。…

rabbitmq--默認模式(點對點)

導入包&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>application.yml springrabbitmq:host: localhostport: 5672username: guestpassword: gue…

外網訪問文檔編輯器Docsify(Windows版本),內網穿透技術應用簡便方法

如果你正在為項目寫文檔&#xff0c;但又不想折騰復雜的構建流程&#xff0c;也不想維護一堆靜態 HTML 文件&#xff0c;那你一定要試試 docsify。docsify 是一個基于 JavaScript 的開源文檔生成工具&#xff0c;它最大的特點就是“無構建”&#xff1a;你只需要寫 Markdown 文…