1. OC 的封装
1.1 使用 pod 方法下载库 pod init ->pod install --repo-update
1.2 Podfile 文件
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target '封装AFN框架' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'AFNetworking'
# Pods for 封装AFN框架
end
1.3 创建 NetworkTool文件
NetworkTool.h文件
#import
#import
NS_ASSUME_NONNULL_BEGIN
//网络请求枚举
typedef enum : NSUInteger {
GET,
POST
} RequestMethod;
@interface NetworkTools : AFHTTPSessionManager
+(instancetype)sharedTools;
-(void) request:(RequestMethod)method URLString:(NSString *)URLString parameters:(nullable id)parameters finished:(void (^)(id result, NSError *error))finished;
@end
NS_ASSUME_NONNULL_END
NetworkTool.m文件
#import "NetworkTools.h"
//网络工具协议
@protocol NetworkToolsProxy
//此方法 AFNetworking 以提供 (供参考)
@optional
- (nullable NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(nullable id)parameters
headers:(nullable NSDictionary *)headers
uploadProgress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
downloadProgress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
@end
//遵守网络协议,意味着有提示
@interface NetworkTools()
@end
@implementation NetworkTools
+(instancetype) sharedTools{
static NetworkTools *tools;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//注意:末尾需要包含 '/'
NSURL *baseUrl = [NSURL URLWithString:@"http://httpbin.org/"];
tools = [[self alloc]initWithBaseURL:baseUrl];
//设置反序列化格式
tools.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
});
return tools;
}
-(void) request:(RequestMethod)method URLString:(NSString *)URLString parameters:(nullable id)parameters finished:(void (^)(id result, NSError *error))finished{
NSString *methodName = (method == GET) ? @"GET": @"POST";
// dataTaskWithHTTPMethod 本类没有实现方法,但父类实现了
// 在调用方法的时候,如果本类没有提供,就直接调用父类的方法,AFN 内部已经实现
NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:methodName URLString:URLString parameters:parameters headers:nil uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
finished(responseObject,nil);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
finished(nil,error);
NSLog(@"%@",error);
}];
[dataTask resume];
}
@end
1.4 调用
#import "ViewController.h"
#import "NetworkTools.h"
@interface ViewController ()
@end
@implementation ViewController
/**
ANF 最常见的网络请求错误
1.不支持的内容 status code = 200 ,需要修改反序列化的 NSSet
2.
*/
- (void)viewDidLoad {
[super viewDidLoad];
[self testPost];
[self testGet];
}
-(void)testPost{
//@{@"name": @"zhangsan",@"age": @22}
[[NetworkTools sharedTools]request:POST URLString:@"http://httpbin.org/post" parameters:NULL finished:^(id _Nonnull result, NSError * _Nonnull error) {
if(error != nil){
NSLog(@"出错了");
return;
}
NSLog(@"%@",result);
}];
}
-(void)testGet{
[[NetworkTools sharedTools]request:GET URLString:@"http://httpbin.org/get" parameters:NULL finished:^(id _Nonnull result, NSError * _Nonnull error) {
if(error != nil){
NSLog(@"出错了");
return;
}
NSLog(@"%@",result);
}];
}
@end
2. Swift 的封装
2.1 使用 CocoaPad 的命令下载库,终端切换到项目文件夹,执行 pod init -> pod install --repo-update
2.2 得到 Podfile 文件,加入 pod 'AFNetworking' , 终端 pod update
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'AFN Swift' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'AFNetworking'
# Pods for AFN Swift
end
2.3 创建 NetworkTools.swift 文件
import UIKit
import AFNetworking
///请求方法枚举
enum RequestMethod: String {
case GET = "GET"
case POST = "POST"
}
//MARK: - 网络工具
class NetworkTools: AFHTTPSessionManager {
//单例
static let sharedTools:NetworkTools = {
let tools = NetworkTools(baseURL: nil)
//设置反序列化数据格式 - 系统会自动将 OC 框架中的 NSSet 转换成 Set
tools.responseSerializer.acceptableContentTypes?.insert("text/html")
return tools
}()
}
//MARK: - 封装 AFN 网络方法
extension NetworkTools{
/// 网络请求
/// - Parameters:
/// - method: GET / POST
/// - URLString: URLString
/// - parameters: 参数字典
/// - finished: 完成回调
func request(method: RequestMethod, URLString: String, parameters: [String: Any]?, finished: @escaping (_ result: Any?, _ error: Error?) -> ()){
let methodName = (method == .GET) ? "GET" : "POST"
dataTask(withHTTPMethod: methodName, urlString: URLString, parameters: parameters, headers: nil, uploadProgress: nil, downloadProgress: nil) { _, result in
finished(result,nil)
} failure: { _, error in
print(error)
finished(nil,error)
}?.resume()
}
/// 网络请求
/// - Parameters:
/// - method: GET / POST
/// - URLString: URLString
/// - parameters: 请求参数
/// - headers: 协议头参数
/// - finished: 完成回调
func request(method: RequestMethod, URLString: String, parameters: [String: Any]?, headers: [String: String]?, finished: @escaping (_ result: Any?, _ error: Error?)->()){
//定义成功回调
let success = { (task: URLSessionDataTask, result: Any?) in
finished(result,nil)
}
//定义失败回调
let failure = {(task: URLSessionDataTask?, error: Error) in
finished(nil,error)
}
if(method == .GET){
get(URLString, parameters: parameters, headers: headers, progress: nil, success: success, failure: failure)
}else{
post(URLString, parameters: parameters, headers: headers, progress: nil, success: success, failure: failure)
}
}
}
2.4 调用
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
testGet()
testPost()
}
/// 测试Get 方法
func testGet(){
NetworkTools.sharedTools.request(method: .GET, URLString: "http://httpbin.org/get", parameters: ["name":"zhangsan", "age": 20]) { result, error in
print(result ?? "")
}
}
/// 测试Post 方法
func testPost(){
NetworkTools.sharedTools.request(method: .POST, URLString: "http://httpbin.org/post", parameters: ["name":"lisi", "age": 17]) { result, error in
print(result ?? "")
}
}
}
3. info.plist 文件中,加上 ATS 设置,否则报错
NSAppTransportSecurity
NSAllowsArbitraryLoads