前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >架构之路 (四) —— APP架构之工程实践中网络层的搭建(二)

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

原创
作者头像
conanma
修改2021-09-06 10:08:33
2390
修改2021-09-06 10:08:33
举报
文章被收录于专栏:正则正则

回顾

上一篇主要讲述了对网络层的架构分析,这一篇根据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

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

代码语言:javascript
复制
/**
    网络请求的基类
 */

@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参数,比如:

代码语言:javascript
复制
#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等请求服务。

代码语言:javascript
复制
JJHTTPSessionManager.h
代码语言:javascript
复制
#import <AFNetworking/AFNetworking.h>

@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
代码语言:javascript
复制
JJHTTPSessionManager.m
代码语言:javascript
复制
#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的子类,专门负责登录模块的接口服务。

代码语言:javascript
复制
#import "JJService.h"

@interface JJLoginService : JJService

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

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

@end
5. global.pch

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

代码语言:javascript
复制
#ifndef global_pch
#define global_pch

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

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

#endif

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

这种网络层的好处:

  • 通过定义基类和继承,可以使不同的业务方独立分开,处理不同的模块更清晰和明确。
  • 需要注意block引起的retain,要weak弱化一下。

后记

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回顾
  • 一种网络层的封装
  • 后记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档