从零开始设计搭建ios App框架(六)

网络接口请求


基本上目前市面上所有app都需要有的功能模块,通过网络接口从服务器获取业务数据。
网络请求模块尽可能与UI界面逻辑分开,在Controller请求数据时尽可能简单。此文将对接口请求模块作一简单地封装。

简要分析
1、API接口请求需要统一入口统一管理。
2、具体的http任务请求(即单个的请求任务HttpClient,不带业务相关逻辑)。
3、跟业务相关的接口定义如接口标识,接口地址。
4、接口请求数据需要签名或者加密。
5、服务器响应后的数据需要按业务解析成UI能用的数据结构对象。
6、接口请求完成后回调。

对象模型

  • PGRequestManager 接口请求管理,为所有业务数据请求提供统一的入口
  • PGHttpClient 封装具体的网络http请求逻辑
  • PGAPI 封装业务相关的接口地址与解析数据入口
  • PGEncrypt 封装一些加密操作,如接口签名等
  • PGDataParseManager 接口请求的回来的数据进行解析
  • PGResultObject 接口请求解析完成后返回给View的数据

PGAPI
定义相关的业务数据接口标识Type,如登录、注册等。

typedef NS_ENUM(NSUInteger, PGApiType) {
    API_TYPE_LOGIN = 1,//登录
    API_TYPE_REGIEST,//注册
    API_TYPE_PRODUCT_LIST,//产品列表
};

定义Api委托协议

@protocol PGApiDelegate <NSObject>
@required
- (void)dataRequestSuccess:(PGResultObject *)resultObj;
- (void)dataRequestFailed:(PGResultObject *)resultObj;
@end

添加获取接口地址与接口数据解析的统一入口。

@interface PGAPI : NSObject

/*
 获取相应的接口地址
 */
+ (NSString *)urlStringWithType:(PGApiType)type;

/*
 解析数据入口
 */
+ (id)parseDataWithType:(PGApiType)type data:(id)data;

@end

//PGAPI.m
@implementation PGAPI

+ (NSString *)urlStringWithType:(PGApiType)type
{
    NSString *urlString = nil;
    switch(type)
    {
        case API_TYPE_LOGIN: {
            urlString = [NSString stringWithFormat:@"%@%@",BASE_URL,@"/u/user/login"];
            break;
        }
        case API_TYPE_REGIEST: {
            urlString = [NSString stringWithFormat:@"%@%@",BASE_URL,@"/u/user/regiest"];
            break;
        }
        default:
            break;
    }
    return urlString;
}

+ (id)parseDataWithType:(PGApiType)type data:(id)data
{
    NSObject *result = nil;
    switch(type)
    {
        case API_TYPE_LOGIN: {
            result = [PGDataParseManager parseLogin:data];
            break;
        }
        case API_TYPE_REGIEST: {
            break;
        }
        default:
            break;
    }
    return result;
}

@end

PGHttpClient 封装具体的网络http请求逻辑

@class PGHttpClient;
@protocol PGHttpClientDelegate <NSObject>
@required
- (void)dataRequestSuccess:(PGResultObject *)resultObj client:(PGHttpClient *)client;
- (void)dataRequestFailed:(PGResultObject *)resultObj client:(PGHttpClient *)client;
@end

/*
 根据业务封装Api接口数据
 */
@interface PGHttpClient : NSObject
@property(nonatomic, assign, readonly)PGApiType apiType;
@property(nonatomic, weak)id<PGApiDelegate> apiDelegate;
@property(nonatomic, weak)id<PGHttpClientDelegate> delegate;
@property(nonatomic, copy)NSString *requestMethod;
/*
 请求策略所用的key值,缓存接口数据与读取接口数据时用。
 */
@property(nonatomic, copy)NSString *strategyKey;

/**
 type: API接口类型
 dicParam: 请求参数
 */
- (instancetype)initWithType:(PGApiType)type requestParam:(NSDictionary *)dicParam;

/**
 开始请求数据
 */
- (void)startRequest;

/**
 取消数据请求
 */
- (void)cancelRequest;

/**
 解析接口返回的json字符数据
 */
- (void)parseData:(NSString *)szString;

@end

PGEncrypt 封装一些加密操作,如接口签名等

@interface PGEncrypt : NSObject

/*
 创建接口签名
 */
+ (NSString *)createSignWith:(NSDictionary *)dictionary;

@end

PGResultObject

#import <Foundation/Foundation.h>

@interface PGResultObject : NSObject
/*
 错误编号
 */
@property(nonatomic, assign)NSInteger nCode;
/*
 错误描述
 */
@property(nonatomic, strong)NSString *szErrorDes;
/*
 接口返回的数据
 */
@property(nonatomic, strong)id dataObject;

@end

PGDataParseManager 所有的业务数据解析,统一一个地方方便修改。

/**
 数据解析管理器,api所有的接口数据都在此文件中解析,方便维护
 */
@interface PGDataParseManager : NSObject

/**
 登录数据解析
 */
+ (id)parseLogin:(NSDictionary *)dictionary;

@end


PGRequestManager 接口请求管理,为所有业务数据请求提供统一的入口

@interface PGRequestManager : NSObject

//普通接口请求
+ (void)startPostClient:(PGApiType)type param:(NSDictionary *)param target:(id<PGApiDelegate>)target tag:(NSString *)tag;
+ (void)startGetClient:(PGApiType)type param:(NSDictionary *)param target:(id<PGApiDelegate>)target tag:(NSString *)tag;

//取消请求
+ (void)cancelClientWithTarget:(id)target tag:(NSString *)tag;

@end

调用示例

  [self showWaitingView:nil viewStyle:EWaitingViewStyle_Rotation];

    [PGRequestManager startPostClient:API_TYPE_LOGIN
                                param:@{@"userName":@"name",@"password":@"123456"}
                               target:self
                                  tag:@"login"];

回调处理

- (void)dataRequestSuccess:(PGResultObject *)resultObj
{
    [self hideWaitingView];
}

- (void)dataRequestFailed:(PGResultObject *)resultObj
{
    [self hideWaitingView];
    [self showMsg:resultObj.szErrorDes];
}

当然也可以设计用Block回调,我这采用delegate主要是考虑到Controller的延迟销毁问题。也就是说Controller已经推出,但接口请求还没停止。block设计方案:

    WEAKSELF
    [PGRequestManager startPostClient:EUCClientType_Login param:@{@"userName":@"name",@"password":@"123456"} target:self tag:@"login" success:^(PGResultObject *resultObj) {
        [weakSelf asyncOnMainQueue:^{
        }];
    } faile:^(UCResultObject *resultObj) {
        [weakSelf asyncOnMainQueue:^{
            [weakSelf showMsg:resultObj.szErrorDes];
        }];
    }];

共同学习进步!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容