iOS AFNetworking各种功能封装类代码

iOS AFNetworking 各种功能封装类代码攻略

什么是 AFNetworking?

AFNetworking 是一个 iOS & macOS 平台上的网络请求框架,它是由 Objective-C 编写而成,是一个轻量级的网络库,提供了 URLSession API 不具备的高级别的抽象。AFNetworking 已经被 iOS 开发者广泛应用于网络请求方面,它提供了方便易用的 API 接口和多种功能封装。

在 iOS 开发中,我们通常需要通过网络请求实现客户端与服务器端的数据交换,而 AFNetworking 通过提供了常用的 GET/POST 请求、文件上传、图片下载、JSON解析等多种功能的封装,大大简化了这方面的开发。下面将为大家讲解,如何使用 AFNetworking 实现常见的几种网络请求功能。

安装 AFNetworking

  • Cocoapods 安装

在项目的 Podfile 文件中添加如下依赖代码:

ruby
pod 'AFNetworking', '~> 4.0'

然后在项目根目录下运行 pod install 命令进行安装。

  • 手动集成

下载 AFNetworking 最新版的源代码集成到项目中。

Get 请求

常规请求

  • Objective-C 代码示例

objective-c
// 初始化AFHTTPSessionManager对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 请求API接口数据
[manager GET:@"https://api.apiopen.top/getJoke?page=1&count=1&type=video" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error: %@", error);
}];

  • Swift 代码示例

swift
// 初始化AFHTTPSessionManager对象
let manager = AFHTTPSessionManager()
// 请求API接口数据
manager.get("https://api.apiopen.top/getJoke?page=1&count=1&type=video", parameters: nil, headers: nil, progress: nil, success: { (task, responseObject) in
print("responseObject: \(String(describing: responseObject))")
}) { (task, error) in
print("error: \(error.localizedDescription)")
}

带参数请求

  • Objective-C 代码示例

objective-c
// 参数
NSDictionary *parameters = @{@"page": @"1",
@"count": @"10",
@"type": @"text"
};
// 初始化AFHTTPSessionManager对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 请求API接口数据
[manager GET:@"https://api.apiopen.top/getJoke" parameters:parameters headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error: %@", error);
}];

  • Swift 代码示例

swift
// 参数
let parameters: [String: Any] = ["page": "1",
"count": "10",
"type": "text"
]
// 初始化AFHTTPSessionManager对象
let manager = AFHTTPSessionManager()
// 请求API接口数据
manager.get("https://api.apiopen.top/getJoke", parameters: parameters, headers: nil, progress: nil, success: { (task, responseObject) in
print("responseObject: \(String(describing: responseObject))")
}) { (task, error) in
print("error: \(error.localizedDescription)")
}

POST 请求

普通参数请求

  • Objective-C 代码示例

objective-c
// 参数
NSDictionary *parameters = @{@"username": @"jack",
@"password": @"123456"
};
// 初始化AFHTTPSessionManager对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 请求API接口数据
[manager POST:@"https://api.apiopen.top/login" parameters:parameters headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error: %@", error);
}];

  • Swift 代码示例

swift
// 参数
let parameters: [String: Any] = ["username": "jack",
"password": "123456"
]
// 初始化AFHTTPSessionManager对象
let manager = AFHTTPSessionManager()
// 请求API接口数据
manager.post("https://api.apiopen.top/login", parameters: parameters, headers: nil, progress: nil, success: { (task, responseObject) in
print("responseObject: \(String(describing: responseObject))")
}) { (task, error) in
print("error: \(error.localizedDescription)")
}

JSON 参数请求

有些接口需要我们传递给服务器的参数不是以普通的参数形式(如:@{ @"username":@"jack", @"password":@"123456" }),而是 JSON 格式的字符串。此时我们需要在 headers 中添加 “Content-Type” 字段。

  • Objective-C 代码示例

objective-c
// 参数
NSDictionary *parameters = @{@"username": @"jack",
@"password": @"123456"
};
// 初始化AFHTTPSessionManager对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 设置请求头
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 请求API接口数据
[manager POST:@"https://api.apiopen.top/login" parameters:parameters headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error: %@", error);
}];

  • Swift 代码示例

swift
// 参数
let parameters: [String: Any] = ["username": "jack",
"password": "123456"
]
// 初始化AFHTTPSessionManager对象
let manager = AFHTTPSessionManager()
// 设置请求头
manager.requestSerializer = AFJSONRequestSerializer()
// 请求API接口数据
manager.post("https://api.apiopen.top/login", parameters: parameters, headers: nil, progress: nil, success: { (task, responseObject) in
print("responseObject: \(String(describing: responseObject))")
}) { (task, error) in
print("error: \(error.localizedDescription)")
}

文件上传

普通请求上传

  • Objective-C 代码示例

objective-c
// 上传文件
NSURL *url = [[NSBundle mainBundle] URLForResource:@"test.jpg" withExtension:nil];
NSData *data = [NSData dataWithContentsOfURL:url];
// 参数
NSDictionary *parameters = @{@"username": @"jack",
@"password": @"123456"
};
// 初始化AFHTTPSessionManager对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 请求API接口数据
[manager POST:@"https://api.apiopen.top/update" parameters:parameters headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
[formData appendPartWithFileData:data name:@"file" fileName:@"test.jpg" mimeType:@"image/jpeg"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
CGFloat progress = uploadProgress.fractionCompleted;
NSLog(@"上传进度: %f", progress);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error: %@", error);
}];

  • Swift 代码示例

swift
// 上传文件
let url = Bundle.main.url(forResource: "test", withExtension: "jpg")!
let data = try! Data(contentsOf: url)
// 参数
let parameters: [String: Any] = ["username": "jack",
"password": "123456"
]
// 初始化AFHTTPSessionManager对象
let manager = AFHTTPSessionManager()
// 请求API接口数据
manager.post("https://api.apiopen.top/update", parameters: parameters, headers: nil, constructingBodyWith: { (formData: AFMultipartFormData) in
formData.appendPart(withFileData: data, name: "file", fileName: "test.jpg", mimeType: "image/jpeg")
}, progress: { (uploadProgress: Progress) in
let progress = uploadProgress.fractionCompleted
print("上传进度: \(progress)")
}, success: { (task, responseObject) in
print("responseObject: \(String(describing: responseObject))")
}) { (task, error) in
print("error: \(error.localizedDescription)")
}

断点续传上传

  • Objective-C 代码示例

objective-c
// 上传文件
NSURL *url = [[NSBundle mainBundle] URLForResource:@"test.jpg" withExtension:nil];
NSData *data = [NSData dataWithContentsOfURL:url];
// 参数
NSDictionary *parameters = @{@"username": @"jack",
@"password": @"123456"
};
// 初始化AFURLSessionManager对象
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
// 创建断点续传的请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.apiopen.top/update"]];
request.HTTPMethod = @"POST";
NSURLSessionUploadTask *uploadTask;
// 判断该文件是否需要断点续传
if ([self checkResumeData]) {
NSData *resumeData = [self getResumeData];
uploadTask = [manager uploadTaskWithResumeData:resumeData fromFile:url progress:^(NSProgress * _Nonnull uploadProgress) {
CGFloat progress = uploadProgress.fractionCompleted;
NSLog(@"上传进度: %f", progress);
} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (error) {
NSLog(@"error: %@", error);
} else {
NSLog(@"responseObject: %@", responseObject);
}
}];
} else {
uploadTask = [manager uploadTaskWithRequest:request fromFile:url progress:^(NSProgress * _Nonnull uploadProgress) {
CGFloat progress = uploadProgress.fractionCompleted;
NSLog(@"上传进度: %f", progress);
} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (error) {
NSLog(@"error: %@", error);
} else {
NSLog(@"responseObject: %@", responseObject);
}
}];
}
// 开始上传
[uploadTask resume];

  • Swift 代码示例

swift
// 上传文件
let url = Bundle.main.url(forResource: "test", withExtension: "jpg")!
let data = try! Data(contentsOf: url)
// 参数
let parameters: [String: Any] = ["username": "jack",
"password": "123456"
]
// 初始化AFURLSessionManager对象
let manager = AFURLSessionManager(sessionConfiguration: .default)
// 创建断点续传的请求
var request = URLRequest(url: URL(string: "https://api.apiopen.top/update")!)
request.httpMethod = "POST"
var uploadTask: URLSessionUploadTask
// 判断该文件是否需要断点续传
if self.checkResumeData() {
let resumeData = self.getResumeData()
do {
let resumeDict = try JSONSerialization.jsonObject(with: resumeData, options: []) as? [String: Any]
uploadTask = try manager.uploadTask(withResumeData: resumeData, from: url, progress: { (uploadProgress: Progress) in
let progress = uploadProgress.fractionCompleted
print("上传进度: \(progress)")
}, completionHandler: { (response: URLResponse, responseObject: Any?, error: Error?) in
if error != nil {
print("error: \(error.debugDescription)")
} else {
print("responseObject: \(String(describing: responseObject))")
}
}) as URLSessionUploadTask
} catch {
print(error.localizedDescription)
return
}
} else {
uploadTask = try! manager.uploadTask(with: request, fromFile: url)
uploadTask.taskDescription = "file"
uploadTask.resume()
}
// 开始上传
uploadTask.resume()

图片下载

  • Objective-C 代码示例

objective-c
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 100, 200, 200)];
[self.view addSubview:imageView];
// 初始化AFHTTPSessionManager对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 请求API接口数据
[manager GET:@"https://th.bing.com/th/id/OIP.p9I9Z8xdbYJ30Bzti9PMqAHaEK?w=274&h=180&c=7&o=5&pid=1.7" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSData *data = [NSData dataWithData:responseObject];
UIImage *image = [UIImage imageWithData:data];
imageView.image = image;
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error: %@", error);
}];

  • Swift 代码示例

swift
let imageView = UIImageView(frame: CGRect(x: 20, y: 100, width: 200, height: 200))
view.addSubview(imageView)
// 初始化AFHTTPSessionManager对象
let manager = AFHTTPSessionManager()
// 请求API接口数据
manager.get("https://th.bing.com/th/id/OIP.p9I9Z8xdbYJ30Bzti9PMqAHaEK?w=274&h=180&c=7&o=5&pid=1.7", parameters: nil, headers: nil, progress: nil, success: { (task, responseObject) in
let data = responseObject as! Data
let image = UIImage(data: data)!
imageView.image = image
}) { (task, error) in
print("error: \(error.localizedDescription)")
}

总结

本文章详细讲解了如何使用 AFNetworking 实现常见的 GET/POST 请求、文件上传、图片下载等功能。对于初学者而言,可以通过此教程入门 AFNetworking,对于有经验的开发者而言,可以巩固自己的知识储备。

以上便是本文的全部内容,由于 AFNetworking 拥有多元化的功能封装,笔者并没有涵盖其全部功能。如果有其他 AFNetworking 的使用技巧、优化方案等方面的问题,可以通过评论区和笔者进行交流。

阅读剩余 89%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:iOS AFNetworking各种功能封装类代码 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 如何查看电脑的内网IP地址?

    Sure! Here is a step-by-step guide on how to view the internal IP address of your computer: 打开命令提示符或终端窗口。在Windows上,你可以按下Win键+R,然后输入\”cmd\”并按下Enter键来打开命令提示符。在Mac上,你可以在\”应用程序\”文件夹中找到…

    other 2023年7月30日
    00
  • 使用增加注册表方式解决Win7右键新建菜单里没有新建Word文档选项

    使用增加注册表方式解决Win7右键新建菜单里没有新建Word文档选项的攻略如下: 1. 打开注册表编辑器 按下 Win + R 组合键打开运行窗口,输入 regedit 并按下回车键打开注册表编辑器。 2. 定位到 “HKEY_CLASSES_ROOT.docx” 键值 在注册表编辑器中,展开 HKEY_CLASSES_ROOT 键,找到 .docx 键值。…

    other 2023年6月27日
    00
  • ios中关于taptic-engine震动反馈的深入解析

    以下是iOS中关于Taptic Engine震动反馈的深入解析的完整攻略: Taptic Engine简介 Taptic Engine是苹果公司在iPhone 7及以后的设备中引入的一种震动反馈技术。使用线性马达来产生不同类型的震动反馈,包括轻触、重击、弹跳等。Taptic Engine可以用于各种应用程序,包括游戏、通知、用户界面等。 Taptic Eng…

    other 2023年5月8日
    00
  • Fragment 多层嵌套方法调用问题的解决方案

    针对“Fragment 多层嵌套方法调用问题的解决方案”,我将提供完整的攻略,包括以下几个方面:问题的背景、解决方案的思路、实现方法和示例说明。请看下文。 问题背景 对于 Android 应用中的 Fragment,我们经常需要进行多层嵌套。例如,在一个界面上,我们可能需要显示一个 ViewPager,其中每一页是一个 Fragment,而每个 Fragme…

    other 2023年6月27日
    00
  • layui自定义工具栏的方法

    下面是layui自定义工具栏的完整攻略: 1. 确定工具栏配置 首先需要确定自定义工具栏的配置项,例如:需要添加什么按钮、需要设置按钮绑定的事件等。 在layui中,工具栏的配置项可以通过form.render()方法进行设置,其中form是layui的一个内置模块,用于处理表单数据和各种表单元素的渲染等操作。 具体的实现方法如下: layui.use([‘…

    other 2023年6月25日
    00
  • 360路由器c301最新固件支持万能中继

    360路由器C301最新固件支持万能中继的完整攻略 360路由器C301是一款性价比较高的路由器,最新固件版本支持万能中继功能,可以帮助用户扩大无线覆盖范围。本文将为您详细讲解360路由器C301最新固件支持万能中继的完整攻略,包括固件升级、中继设置等内容。 固件升级 在使用万能中继功能之前,需要先升级路由器的固件版本。以下是升级360路由器C301固件的步…

    other 2023年5月6日
    00
  • Java获取电脑真实IP地址的示例代码

    获取电脑真实IP地址是Java编程中的一个常见需求。下面是一个完整的攻略,包含了两个示例说明。 示例1:使用InetAddress类获取本机IP地址 import java.net.InetAddress; import java.net.UnknownHostException; public class GetIPAddressExample { pub…

    other 2023年7月30日
    00
  • oracle行转列方法集合汇总(推荐!)

    Oracle行转列方法集合汇总(推荐!) 在Oracle中,经常需要将行数据转换为列数据。这种数据转换方法在数据处理和分析过程中非常有用。本文将介绍Oracle中行转列的多种方法,包括使用PIVOT函数、DECODE函数和CASE语句等。 使用PIVOT函数进行行转列 PIVOT函数是Oracle 11g引入的新特性之一,它可以将行数据转换为列数据。使用PI…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部