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 的使用技巧、优化方案等方面的问题,可以通过评论区和笔者进行交流。

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

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

相关文章

  • CentOS7中KVM虚拟机内存、CPU调整

    CentOS7中KVM虚拟机内存、CPU调整 在CentOS 7中,通过KVM虚拟化平台可以创建多个虚拟机,并可以通过调整内存和CPU的分配来满足不同虚拟机的需求。本文将介绍如何在CentOS 7中使用KVM虚拟化平台对虚拟机的内存和CPU进行调整。 1. 确认KVM虚拟机内存及CPU 通过使用以下命令可以查看KVM虚拟机的内存及CPU的信息: # virs…

    其他 2023年3月28日
    00
  • linux轻量级 Web 服务器第1/2页

    Linux轻量级Web服务器攻略 本攻略旨在为初学者提供Linux轻量级Web服务器的基本操作和安装方法。在本攻略中,我们将会涉及以下主题: 轻量级Web服务器的定义和作用 安装和配置Apache 理解Apache的常见配置文件 使用Apache来部署简单的网站 检测Apache的服务状态和日志 1. 轻量级Web服务器的定义和作用 什么是轻量级Web服务器…

    other 2023年6月27日
    00
  • c#中 什么时候用yieldreturn

    c#中什么时候用yield return 在C#中,使用yield return关键字可以将一个方法转化为一个迭代器。当方法返回一个迭代器时,每次调用MoveNext()方法时都会执行一部分方法,返回一个值,并在下次继续执行方法,直到所有值都被返回。在本文中,我们将讨论在何种情况下应该使用yield return。 1. 处理大量数据 当需要处理大量数据时,…

    其他 2023年3月28日
    00
  • iOS实现无限循环滚动的TableView实战教程

    通过以下步骤实现无限循环滚动的TableView: 步骤一:数据处理 在 UITableViewDataSource 协议里实现 tableView(_:numberOfRowsInSection:) 方法,返回一个足够大的数,比如说 1000,这样当 TableView 在滚动时,即使看似滚到了最后一行,其实还有许多没有展示出来的数据。 示例: func …

    other 2023年6月26日
    00
  • IDEA无法打开Marketplace的三种解决方案(推荐)

    下面是详细的攻略: IDEA无法打开Marketplace的三种解决方案(推荐) 问题描述 当使用 IntelliJ IDEA 打开 Marketplace 时,有可能会出现以下错误: Plugin repository connect failed: Connection refused: connect 这意味着无法连接到插件仓库,这将导致无法搜索或安装…

    other 2023年6月26日
    00
  • js动态删除div元素

    以下是JS获取天气的完整攻略,包括基本介绍、使用方法、示例说明等内容。 1. 基本介绍 在Web开发中,我们经常需要获取天气信息。JS获取天气信息是其中的一种常见需求。通过JS获取天气信息,我们可以实现动态更新页面内容,提高用户体验。 2. 使用方法 以下是使用JS获取天气信息的基本步骤: 获取天气API。我们可以使用第三方天气API获取天气信息。常用的天气…

    other 2023年5月10日
    00
  • linux如何部署nginx

    Linux如何部署nginx 在Linux服务器上部署nginx可以快速搭建一个高性能的web服务器,本文将介绍如何在Linux上安装和配置nginx。 步骤一:安装nginx 使用命令行工具登录到Linux服务器; 安装nginx,命令如下: sudo apt update sudo apt install nginx 等待安装完成,安装成功后启动ngin…

    其他 2023年3月28日
    00
  • Android混合开发教程之WebView的使用方法总结

    Android混合开发教程之WebView的使用方法总结 介绍 WebView是Android开发中常用的控件,用于在应用程序中显示网页内容。本教程将详细介绍WebView的使用方法。 步骤 步骤一:在布局文件中添加WebView控件 首先,在你的布局文件中添加一个WebView控件,用于显示网页内容。以下是一个示例: <WebView android…

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