基于AFNetworking的轻量级网络请求框架

网络请求一直以来都是移动开发的必备,封装一个接口清晰、实现简洁高效的网络框架也是开发的重中之重,同时也是开源的基本要求。这篇文章将简单介绍近期开源的一个网络框架--JCNetworking,它基于 AFNetworking 网络库做了一层封装,形成了以对象的方式发送网络请求的这么一个轻量级网络请求框架。

这套框架目前支持以下操作:

  1. 支持通用GET/POST网络请求;
  2. 支持文件数据上传;
  3. 支持HTTPS网络请求。

网络请求

这里以微信开放平台第三方帐号登录为例子,阐述如何使用该网络框架实现响应数据解析、请求数据拼接、请求发起、响应回调等操作。

  • 响应数据类
/** 响应数据基类 */
@interface JCWeixinBaseResp : JCModel

@property (nonatomic, copy) NSString *errcode;
@property (nonatomic, copy) NSString *errmsg;

@end
/** access token 响应数据信息类 */
@interface JCWeixinAccessTokenResp : JCWeixinBaseResp

@property (nonatomic, copy) NSString *access_token;
@property (nonatomic, copy) NSString *expires_in;
@property (nonatomic, copy) NSString *refresh_token;
@property (nonatomic, copy) NSString *openid;
@property (nonatomic, copy) NSString *scope;

@end
  • 请求类实现(包括返回baseUrl、响应数据解析等等)
/** 微信帐号第三方登录请求基类 */
@interface JCWeixinBaseRequest : JCBaseRequest
- (Class)decodeClass;
@end

@implementation JCWeixinBaseRequest

- (NSString *)baseUrl
{
    return @"https://api.weixin.qq.com/";
}

- (void)parseResponseObject:(id)responseObject
                      error:(NSError *)error
{
    // 网络请求超时或服务器错误
    if (error) {
        if (self.completionBlock) {
            self.completionBlock(nil, error);
        }
        return;
    }
    
    // 解析类不存在,直接返回数据
    Class decodeClass = [self decodeClass];
    if (!decodeClass || ![decodeClass isSubclassOfClass:[JCModel class]]) {
        if (self.completionBlock) {
            self.completionBlock(responseObject, nil);
        }
        return;
    }
    
    NSError *respError = nil;
    JCWeixinBaseResp *resp = [decodeClass objWithJson:responseObject error:&respError];
    // 解析数据格式错误
    if (respError || !resp) {
        if (self.completionBlock) {
            self.completionBlock(nil, respError);
        }
        return;
    }
    
    // 业务逻辑错误
    if (resp.errcode.integerValue != 0) {
        respError = [NSError errorWithDomain:@"network" code:resp.errcode.integerValue userInfo:@{NSLocalizedDescriptionKey: (resp.errmsg ?:@"")}];
        if (self.completionBlock) {
            self.completionBlock(resp, respError);
        }
        return;
    }
    
    // 正常数据
    if (self.completionBlock) {
        self.completionBlock(resp, nil);
    }
}

@end
  • 发起网络请求、响应回调
// 发起获取access token的网络请求
self.accessTokenRequest = [[JCWeixinAccessTokenRequest alloc] init];
self.accessTokenRequest.parameters = @{@"appid":@"your appid", @"secret":@"your secret", @"code":@"your code"};
[self.accessTokenRequest startRequestWithCompletion:^(id responseObject, NSError *error) {
    // responseObject为JCWeixinAccessTokenResp类对象
}];

文件数据上传

以POST发起文件数据上传请求,需要传递上传操作名、上传文件数据或路径等参数,同时可通过回调实时获取上传进度。

// 发送文件上传请求
- (void)startUploadRequest
{
    self.uploadRequest = [[JCUploadTestRequest alloc] init];
    [self.uploadRequest setUploadFilePath:@"file path"
                                                 uploadName:@"file"];
    [self.uploadRequest startRequestWithProgress:^(NSProgress *progress) {
        // 通过progress更新进度
    } completion:^(id responseObject, NSError *error) {
        // responseObject为JCUploadTestResp类对象
    }];
}

根据以上的例子,以对象的方式发送网络请求和返回响应数据可以简单概括为:在需要传参数的接口对应的网络请求类中,声明对应参数名称的属性,发送请求的时候给各个属性赋值。请求成功后返回decodeClass对应的实例对象responseObject,可以直接使用该实例对象不用再解析了。
关于框架的更多细节,请关注这里 JCNetworking,有任何疑问或者建议请在下方留言。

你可能感兴趣的:(基于AFNetworking的轻量级网络请求框架)