上一篇主要讲述了对网络层的架构分析,这一篇根据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文件。下面我们就大概的看一下每一个文件或者模块。
下面我们看一下这个基类的接口的定义。
/**
网络请求的基类
*/
@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中。
里面定义了不同模块使用的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
它继承了AFHTTPSessionManager
,提供了GET/POST等请求服务。
JJHTTPSessionManager.h
#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
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
这里是JJService
的子类,专门负责登录模块的接口服务。
#import "JJService.h"
@interface JJLoginService : JJService
//这里处理登录逻辑的网络请求
+ (instancetype)service;
//下面就是登录相关的一些接口
@end
这个没什么说的,全局的PCH文件。
#ifndef global_pch
#define global_pch
//网络请求类
#import "JJService.h"
//网络请求类用来存放host
#import "JJServiceDefine.h"
#endif
这里存放的就是一些全局共享的东西,这里也不多说了。
这种网络层的好处:
本篇主要介绍了工程项目中常见的网络层的架构,来自工程实践的验证,并已经进行了脱敏处理,感兴趣的给个赞或者关注~~~~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。