AFNetworking 框架封装

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 <Foundation/Foundation.h>
#import <AFNetworking.h>

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 <NSObject>

//此方法 AFNetworking 以提供 (供参考)
@optional
- (nullable NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
                                                URLString:(NSString *)URLString
                                               parameters:(nullable id)parameters
                                                  headers:(nullable NSDictionary <NSString *, NSString *> *)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() <NetworkToolsProxy>
@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 设置,否则报错

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于Android网络框架封装,有许多不同的选择。以下是一些常见的网络框架封装方法: 1. Volley:Volley是Google推出的用于Android应用程序的网络通信库。它使用简单且易于集成,具有高效的网络请求队列和缓存机制。你可以封装Volley以满足你的特定需求,例如添加身份验证、错误处理或数据解析等功能。 2. OkHttp:OkHttp是一个开源的HTTP客户端库,可用于Android应用程序中的网络通信。它提供了简单易用的API,支持同步和异步请求,并具有连接池和缓存等功能。你可以使用OkHttp封装网络请求,自定义拦截器和事件监听器,以及处理各类错误和异常情况。 3. Retrofit:Retrofit是Square公司开发的一个类型安全的RESTful网络请求库。它基于OkHttp,并提供了简洁的注解接口来定义API请求。你可以封装Retrofit以定义你的API接口和请求参数,并处理响应结果、错误情况和数据解析等。 4. 自定义封装:除了使用现有的网络框架,你还可以根据你的需求自定义封装一个网络库。这种方式可以灵活地满足特定的业务需求。你可以使用Java的URLConnection或Apache HttpClient等原生库进行底层网络通信,并自定义请求、解析和错误处理等逻辑。 在封装网络框架时,你可以考虑以下几点: - 封装请求方法(GET、POST等)和参数(URL、请求头、请求体等)的接口。 - 统一处理错误和异常情况,例如网络连接失败、超时、服务器错误等。 - 可选地处理数据解析和转换,例如使用Gson库将JSON数据转换为Java对象。 - 支持并发请求和线程管理,以避免阻塞主线程。 - 可选地添加缓存机制,以减少重复请求和提高性能。 - 可选地添加身份验证和安全机制,以保护数据的传输和存储安全。 以上是一些常见的Android网络框架封装方法,你可以根据具体需求选择适合你项目的框架或自定义封装
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hanyang Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值