架构之路 (四) —— APP架构之工程实践中网络层的搭建(二)

版本记录

版本号 时间
V1.0 2018.05.19

前言

前面写了那么多篇主要着眼于局部问题的解决,包括特定功能的实现、通用工具类的封装、视频和语音多媒体的底层和实现以及动画酷炫的实现方式等等。接下来这几篇我们就一起看一下关于iOS系统架构以及独立做一个APP的架构设计的相关问题。感兴趣的可以看上面几篇。
1. 架构之路 (一) —— iOS原生系统架构(一)
2. 架构之路 (二) —— APP架构分析(一)
3. 架构之路 (三) —— APP架构之网络层分析(一)

回顾

上一篇主要讲述了对网络层的架构分析,这一篇根据demo一起进行网络层的实现。


一种网络层的封装

下面我们就看一下一种网络层的封装。

这里需要和大家说一下:

  • JJService是网络请求的基类。里面包含不同参数的几种GET或者POST请求。
  • JJServiceDefine定义了一些不同页面模块用到的host,比如static NSString * const kUserHost = @"http://user.xxxxx.com";
  • JJHTTPSessionManager.h,它继承了AFN的AFHTTPSessionManager,提供了参数最全的GET和POST请求。
  • JJLoginService.h,这个是JJService的子类,专门负责登录模块的接口服务。
  • global.pch,这个很清楚就是全局的PCH文件。

下面我们就大概的看一下每一个文件或者模块。

1. JJService.h

下面我们看一下这个基类的接口的定义。

/**
    网络请求的基类
 */

@interface JJService : NSObject

@property (nonatomic, copy) NSString *host;

- (instancetype)initWithHost:(NSString *)host;

//发送Get请求到URL
- (void)getDataWithURL:(NSString *)url completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;

//发送Get请求到host+uri
- (void)get:(NSString *)uri completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
- (void)get:(NSString *)uri parameters:(NSDictionary *)params completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
- (void)get:(NSString *)uri host:(NSString *)host parameters:(NSDictionary *)params completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;

//发送Post请求到host+uri
- (void)post:(NSString *)uri completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
- (void)post:(NSString *)uri parameters:(NSDictionary *)params completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;
- (void)post:(NSString *)uri host:(NSString *)host parameters:(NSDictionary *)params completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;

- (void)uploadFileData:(NSData *)data uri:(NSString *)uri parameters:(NSDictionary *_Nullable )parameters completion:(JJCompletionBlock)completion failure:(JJFailureBlock)failure;

@end

这里不同的方法,最后都会调用参数最齐备的方法在.m中。

2. JJServiceDefine

里面定义了不同模块使用的host参数,比如:

#ifndef JJServiceDefine_h
#define JJServiceDefine_h

//User Host
static NSString * const kUserHost = @"http://user.xxxxx.com";

//登录host
static NSString * const kLoginHost = @"http://gh.login.com/";

#endif

3. JJHTTPSessionManager

它继承了AFHTTPSessionManager,提供了GET/POST等请求服务。

JJHTTPSessionManager.h
#import 

@interface JJHTTPSessionManager : AFHTTPSessionManager

- (nullable NSURLSessionDataTask *)JJGet:(NSString *_Nonnull)URLString
                              parameters:(nullable id)parameters
                                progress:(nullable void (^)(NSProgress * _Nullable downloadProgress))downloadProgress
                                 success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id _Nullable responseObject))success
                                 failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError * _Nullable error))failure;

- (nullable NSURLSessionDataTask *)JJPost:(NSString *_Nonnull)URLString
                               parameters:(nullable id)parameters
                                 progress:(nullable void (^)(NSProgress *   _Nullable uploadProgress))uploadProgress
                                  success:(nullable void (^)(NSURLSessionDataTask *   _Nullable task, id _Nullable responseObject))success
                                  failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError * _Nullable error))failure;

@end
JJHTTPSessionManager.m
#import "JJHTTPSessionManager.h"

@implementation JJHTTPSessionManager

- (nullable NSURLSessionDataTask *)JJGet:(NSString *_Nonnull)URLString
                              parameters:(nullable id)parameters
                                progress:(nullable void (^)(NSProgress * _Nullable downloadProgress))downloadProgress
                                 success:(nullable void (^)(NSURLSessionDataTask * _Nullable task, id _Nullable responseObject))success
                                 failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError * _Nullable error))failure
{
    //设置请求头
    self.requestSerializer = [AFHTTPRequestSerializer serializer];
    [self.requestSerializer setValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    [self setRequestHeader:self.requestSerializer];
    
    //设置数据类型
    self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/html", nil];
    
    return [super GET:URLString parameters:parameters progress:downloadProgress success:success failure:failure];
}

- (nullable NSURLSessionDataTask *)JJPost:(NSString *_Nonnull)URLString
                               parameters:(nullable id)parameters
                                 progress:(nullable void (^)(NSProgress *   _Nullable uploadProgress))uploadProgress
                                  success:(nullable void (^)(NSURLSessionDataTask *   _Nullable task, id _Nullable responseObject))success
                                  failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError * _Nullable error))failure
{
    //设置请求头
    self.requestSerializer = [AFHTTPRequestSerializer serializer];
    [self.requestSerializer setValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    [self setRequestHeader:self.requestSerializer];
    
    //设置数据类型
    self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/html", nil];
    
    return [self POST:URLString parameters:parameters progress:uploadProgress success:success failure:failure];
}

- (void)setRequestHeader:(AFHTTPRequestSerializer *)request
{
    //这里设置的是请求的一些基本参数
    [self.requestSerializer setValue:@"个人的userId" forHTTPHeaderField:@"userid"];
    [self.requestSerializer setValue:@"token值" forHTTPHeaderField:@"token"];
}

@end

4. JJLoginService

这里是JJService的子类,专门负责登录模块的接口服务。

#import "JJService.h"

@interface JJLoginService : JJService

//这里处理登录逻辑的网络请求
+ (instancetype)service;

//下面就是登录相关的一些接口

@end

5. global.pch

这个没什么说的,全局的PCH文件。

#ifndef global_pch
#define global_pch

//网络请求类
#import "JJService.h"

//网络请求类用来存放host
#import "JJServiceDefine.h"

#endif

这里存放的就是一些全局共享的东西,这里也不多说了。

这种网络层的好处:

  • 通过定义基类和继承,可以使不同的业务方独立分开,处理不同的模块更清晰和明确。

  • 需要注意block引起的retain,要weak弱化一下。

后记

本篇主要介绍了工程项目中常见的网络层的架构,来自工程实践的验证,并已经进行了脱敏处理,感兴趣的给个赞或者关注~~~~

你可能感兴趣的:(架构之路 (四) —— APP架构之工程实践中网络层的搭建(二))