【iOS】使用AFNetworking进行网络请求

news2024/11/5 17:59:27

文章目录

  • 前言
  • AFNetworking
    • AFNetworking 的核心组件
    • AKNetworking库的常用方法
    • 使用AKNetworking进行网络请求的步骤和代码示例
  • 总结

前言

  在暑假写天气预报项目时,我们已经接触到网络请求,当时我们是使用URLSession类,即Foundation框架中用于管理和配置网络连接的API,来完成对实时天气预报数据的请求,现在我们来学习一种更方便的网络请求方式——使用一个单例通过AFNetworking来实现网络请求。

AFNetworking

  AFNetworking 是一个开源的网络库,它基于 NSURLSession,为 iOS、macOS、watchOS 和 tvOS 应用程序开发提供了强大的网络请求功能。AFNetworking 通过简单的 API 设计,使得开发者可以轻松地处理 HTTP 请求,包括 GET、POST、PUT、DELETE 等操作。它还支持文件上传、下载、自动处理 HTTP 缓存、自定义缓存策略、安全性设置等高级特性。

由此来看,AKNetworking库兼容了我们之前使用URLSession类来进行网络请求的方法。使用这个库可以简化我们进行网络请求的代码,在使用前记得下载cocoapods然后将该库安装到对应的文档里。

AFNetworking 的核心组件

AFHTTPSessionManager:这是最常用的类,用于处理 HTTP 请求。它基于 NSURLSession,可以发送网络请求和处理响应。
AFURLSessionManager:同样基于 NSURLSession,用于管理下载、上传等任务。
AFNetworkReachabilityManager:用于监控网络状态的变化,帮助开发者了解当前的网络连接情况。
序列化和反序列化:AFNetworking 自动解析响应的数据格式,如 JSON、XML、图片等,并且支持自定义序列化和反序列化操作。

AKNetworking库的常用方法

  1. AFHTTPSessionManager:这是最常用的类,用于处理 HTTP 请求。它基于 NSURLSession,可以发送网络请求和处理响应。

  2. GET 请求:使用 GET 方法发送请求,可以传递参数字典,并且在请求成功或失败时提供回调。

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    NSDictionary *parameters = @{@"key": @"value"};
    [manager GET:@"http://example.com/api" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"Success: %@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    
  3. POST 请求:使用 POST 方法发送请求,同样可以传递参数字典,并在请求成功或失败时提供回调。

    [manager POST:@"http://example.com/api" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"Success: %@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    
  4. 文件上传:AFNetworking 支持文件上传,并且可以监控上传进度。

    NSURL *fileURL = [NSURL fileURLWithPath:@"path/to/file"];
    [manager POST:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:fileURL name:@"file" fileName:@"filename" mimeType:@"file mimeType"];
    } progress:^(NSProgress *uploadProgress) {
        NSLog(@"Upload Progress: %@%", uploadProgress.fractionCompleted);
    } success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"Success: %@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    
  5. 文件下载:AFNetworking 也支持文件下载,并且可以指定下载进度和完成时的回调。

    NSURL *fileURL = [NSURL URLWithString:@"http://example.com/file"];
    NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:fileURL] progress:^(NSProgress *downloadProgress) {
        NSLog(@"Download Progress: %@%", downloadProgress.fractionCompleted);
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        return [NSURL fileURLWithPath:@"path/to/save/file"];
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        if (error) {
            NSLog(@"Download Error: %@", error);
        } else {
            NSLog(@"Download Success: %@", filePath);
        }
    }];
    [downloadTask resume];
    
  6. 网络状态监控:使用 AFNetworkReachabilityManager 可以监控网络状态的变化。

    AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManager sharedManager];
    [reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"Reachable via WiFi");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"Reachable via WWAN");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"Not reachable");
                break;
        }
    }];
    [reachabilityManager startMonitoring];
    
  7. 响应序列化:AFNetworking 提供了多种响应序列化器,如 AFJSONResponseSerializerAFXMLParserResponseSerializer 等,用于自动解析服务器返回的数据。

  8. 单例模式:在实际应用中,通常会将 AFNetworking 封装在单例类中,以便在整个应用中统一管理和使用网络请求。

  9. 缓存机制:AFNetworking 支持内存缓存和磁盘缓存,可以配置缓存策略来提高应用性能和用户体验 。

  10. HTTPS 和 SSL/TLS 支持:AFNetworking 支持 HTTPS 请求,并且可以配置 SSL/TLS 证书,以确保数据传输的安全性 。

  11. 响应式布局和动态请求:可以根据不同的设备和屏幕尺寸动态调整请求参数,以适应不同的设备和屏幕尺寸 。

  12. 复合响应序列化AFCompoundResponseSerializer 允许同时使用多个响应序列化器,这在处理复杂或混合格式的响应时非常有用。

  13. 图片加载和处理AFImageResponseSerializer 不仅可以处理图片的下载,还可以进行图片的解压和缓存,以提高图片显示的性能 。

  14. 错误处理和重试机制:AFNetworking 提供了丰富的错误处理机制,你可以设置重试策略,以应对网络不稳定或服务器错误的情况。

使用AKNetworking进行网络请求的步骤和代码示例

引入 AFNetworking:通过 CocoaPods 或其他依赖管理工具将 AFNetworking 添加到项目中。

创建 AFHTTPSessionManager 实例:这个实例将用于发起网络请求。

配置请求和响应序列化器:AFNetworking 提供了多种序列化器,如 AFJSONRequestSerializer 和 AFJSONResponseSerializer,用于处理 JSON 格式的数据。

发起网络请求:使用 GET、POST 等方法发起网络请求,并在回调中处理响应数据。

处理响应和错误:在回调中,你可以获取到响应数据,并根据需要进行处理。

// 创建 AFHTTPSessionManager 实例
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 设置请求和响应序列化器
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];

// 发起 GET 请求
[manager GET:@"https://example.com/api/resource" parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
    // 请求成功的回调
    NSLog(@"Response: %@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    // 请求失败的回调
    NSLog(@"Error: %@", error);
}];

总结

  AFNetworking 作为一个开源库,简化了网络请求的过程,相比于之前使用xcode自带的URLSession类来进行网络请求便利许多,在后续写项目的过程中有时应该会更加明显。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2233728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AUTOSAR CP MCAL微控制器抽象层介绍

AUTOSAR(Automotive Open System Architecture)即汽车开放系统架构,它将汽车电子控制单元(ECU)的软件底层做了一个标准的封装,使得开发者能够共用一套底层软件,并通过修改参数来匹配不同的硬件和应用层软件。AUTOSAR CP(Classic Platform)是AUTOSAR架构中的一个重要组…

yoloV5实战笔记—环境搭建(一)

一、安装miniconda 从清华源进行下载 https://mirrors.tuna.tsinghua.edu.cn/ 具体命令参考&#xff0c;注意修改pip国内镜像地址 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 创建环境&#xff0c;指定python版本 conda create -n demo python3.9激活环境 conda acti…

【贪心】【可行范围内最大边界】SCNU习题 P25.跳跃游戏

算法思想&#xff1a; 每次迭代更新可行至的最大范围r(r必保证>原位置&#xff09;&#xff0c;至到迭代结束&#xff0c;若r>length of array则说明可以跳跃至此 #include <iostream> #include <vector> #include <string> #include <sstre…

29.2 golang实战项目log2metrics架构说明

本节重点介绍 : 需求分析流程说明log2metrics架构设计 架构图 需求分析 算qps 比如统计 nginx日志中code200的qps对应就是 每隔10秒grep一下日志文件 &#xff0c;用增量/时间差 算出qps 日志关键字告警 错误类型的关键字举例 如应用连接mysql报错dial mysql host error…

基于 Spring Boot 和 Vue 的门票销售创新系统

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

沃德校园助手系统源码

沃德校园助手系统&#xff0c;专为校园团队量身打造&#xff0c;提供了一站式的技术系统与运营解决方案&#xff0c;目前该系统已深度适配微信小程序平台&#xff0c;旨在助力校园团队轻松构建属于自己的线上助手平台。 在功能性方面&#xff0c;沃德校园助手系统涵盖了多种校…

Qt QCheckBox、QPushButton和QRadioButton详解

QCheckBox&#xff08;复选框&#xff09; 功能&#xff1a;QCheckBox用于创建一个复选框控件&#xff0c;允许用户从多个选项中选择多个。 属性&#xff1a; checkable&#xff1a;决定复选框是否可以被选中或取消选中。checked&#xff1a;表示复选框当前的选中状态&#…

DDR5内存售价暴降80%,终于到了无脑下手的时候

DDR5 内存刚面世那会儿&#xff0c;大家吐槽最多的便是频率低、延迟高、价格还死贵死贵。 前两年首批 DDR5 内存频率多集中在 4800、5200、5600MT/s 等入门水平。 延迟高、游戏性能不如高频 DDR4 内存的同时&#xff0c;单条 16G 售价普遍来到 1000 元开外&#xff0c;部分 3…

Jenkins找不到maven构建项目

有的可能没有出现maven这个选项 解决办法&#xff1a;需要安装Maven项目插件 输入​Maven Integration plugin​

基于大数据的热门旅游景点数据分析系统的设计与实现

作者主页&#xff1a;编程千纸鹤 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

计算机网络:网络层 —— 移动 IP 技术

文章目录 移动性对因特网应用的影响移动 IP 相关基本概念移动IP技术的基本工作原理代理发现与注册固定主机向移动主机发送IP数据报移动主机向固定主机发送IP数据报同址转交地址方式三角形路由问题 移动性对因特网应用的影响 我们列举如下三个应用场景说明移动性对因特网应用的…

ssm校园二手交易管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 1 绪论 1 1.1 选题背景 1 1.2 选题意义 1 1.3 研究内容 2 2 系统开发技术 3 2.1 MySQL数…

CCS下载安装(以12.3.0版本为例)

Code Composer Studio 是一个集成开发环境 (IDE)&#xff0c;简称CCS软件。支持 TI 的微控制器和嵌入式处理器产品的开发。Code Composer Studio 包含一整套用于开发和调试嵌入式应用程序的工具。 CCS9.3.0及以上版本不需要License文件&#xff0c;但是CCS旧版本比如CCS5.5.0需…

短视频时代的崛起:TikTok为何如此受欢迎?

在数字媒体日益发展的今天&#xff0c;短视频已成为一种主流的传播形式&#xff0c;而TikTok则是这一趋势的代表性平台。自2016年上线以来&#xff0c;TikTok迅速崛起&#xff0c;吸引了全球数亿用户的关注和参与。究竟是什么让这款应用如此受欢迎&#xff1f;以下是对TikTok成…

SAP财务凭证冲销接口代码实现

SAP提供了标准的BAPI(BAPI_ACC_DOCUMENT_REV_POST)进行凭证冲销,但是由于很多参考过程不可以用标准BAPI进行冲销,所以我们不得不采用其它的方式来进行冲销的实现。 该示例是采用三个功能模块来实现凭证冲销的接口程序: POSTING_INTERFACE_START 内部预订界面启动信息 POS…

Vagrant使用教程:创建CentOS 8虚拟机

目录 简介准备工作下载配置Vagrant修改环境变量创建VAGRANT_HOME环境变量修改virturalBox新建虚拟机文件的默认生成路径修改Vagrant配置支持VirtualBox7.1.x版本创建Vagrant文件添加镜像 初始化并开机初始化开发环境开机 其他配置项宿主机的交换目录修改虚拟机内存修改 访问方式…

虚拟机 Ubuntu 扩容

文章目录 一、Vmware 重新分配 Ubuntu 空间二、Ubuntu 扩容分区 一、Vmware 重新分配 Ubuntu 空间 先打开 Vmware &#xff0c;选择要重新分配空间的虚拟机 点击 编辑虚拟机设置 &#xff0c;再点击 硬盘 &#xff0c;再点击 扩展 选择预计扩展的空间&#xff0c;然后点击 扩展…

CSS网页布局综合练习(涵盖大多CSS知识点)

该综合练习就是为这个学校静态网页设置CSS样式&#xff0c;使其变成下面的模样 其基本骨架代码为&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content…

【UGUI】实现点击注册按钮跳转游戏场景

1. 代码实现 首先&#xff0c;我们需要编写一个脚本来管理注册界面的显示和场景的切换。以下是完整的代码&#xff0c;并附有详细的注释说明&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagemen…

uniapp+vite配置环境变量

文章目录 前言一、配置变量二、定义变量生效三、脚本执行使其生效使用 总结如有启发&#xff0c;可点赞收藏哟~ 前言 查看官方文档 由于官方提示不支持在package.json配置脚本 --mode xx&#xff08;实际H5是可以的&#xff0c;但是在微信小程序等使用import.meta.env就会报错…