Skip to content

Commit 76487f7

Browse files
committed
封装网络请求
1 parent fe3e573 commit 76487f7

3 files changed

Lines changed: 280 additions & 0 deletions

File tree

KtTableView/KtTableView.xcodeproj/project.pbxproj

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
E1621E1B1CBDF267003D9438 /* KtTableViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E1621E1A1CBDF267003D9438 /* KtTableViewTests.m */; };
2626
E1621E261CBDF267003D9438 /* KtTableViewUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = E1621E251CBDF267003D9438 /* KtTableViewUITests.m */; };
2727
E19B41191CC21555008A3E7F /* KtTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E19B41181CC21555008A3E7F /* KtTableViewController.m */; };
28+
E1DCC9F21CE5A6A000CDC83D /* KtBaseServerAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = E1DCC9F11CE5A6A000CDC83D /* KtBaseServerAPI.m */; };
2829
E1EE5C9D1CBE811C0095688B /* KtBaseTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = E1EE5C9C1CBE811C0095688B /* KtBaseTableView.m */; };
2930
/* End PBXBuildFile section */
3031

@@ -83,6 +84,8 @@
8384
E1621E271CBDF267003D9438 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
8485
E19B41171CC21555008A3E7F /* KtTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KtTableViewController.h; sourceTree = "<group>"; };
8586
E19B41181CC21555008A3E7F /* KtTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KtTableViewController.m; sourceTree = "<group>"; };
87+
E1DCC9F01CE5A6A000CDC83D /* KtBaseServerAPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KtBaseServerAPI.h; sourceTree = "<group>"; };
88+
E1DCC9F11CE5A6A000CDC83D /* KtBaseServerAPI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KtBaseServerAPI.m; sourceTree = "<group>"; };
8689
E1EE5C9B1CBE811C0095688B /* KtBaseTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KtBaseTableView.h; sourceTree = "<group>"; };
8790
E1EE5C9C1CBE811C0095688B /* KtBaseTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KtBaseTableView.m; sourceTree = "<group>"; };
8891
/* End PBXFileReference section */
@@ -222,8 +225,13 @@
222225
path = KtTableViewUITests;
223226
sourceTree = "<group>";
224227
};
228+
E1DCC9EC1CE5A5FA00CDC83D /* KtBaseModel */ = {
225229
isa = PBXGroup;
226230
children = (
231+
E1DCC9F01CE5A6A000CDC83D /* KtBaseServerAPI.h */,
232+
E1DCC9F11CE5A6A000CDC83D /* KtBaseServerAPI.m */,
233+
);
234+
path = KtBaseModel;
227235
sourceTree = "<group>";
228236
};
229237
F71B31402A7F180F563A44F9 /* Frameworks */ = {
@@ -422,6 +430,7 @@
422430
E108B2AB1CBE14C300191E0B /* KtTableViewDataSource.m in Sources */,
423431
E108B2B71CBE1F6500191E0B /* KtTableViewBaseItem.m in Sources */,
424432
E108B2B11CBE191300191E0B /* KtBaseTableViewCell.m in Sources */,
433+
E1DCC9F21CE5A6A000CDC83D /* KtBaseServerAPI.m in Sources */,
425434
E1621E081CBDF267003D9438 /* KTMainViewController.m in Sources */,
426435
E1EE5C9D1CBE811C0095688B /* KtBaseTableView.m in Sources */,
427436
E1621E051CBDF267003D9438 /* AppDelegate.m in Sources */,
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
//
2+
// KtBaseServerAPI.h
3+
// KtTableView
4+
//
5+
// Created by baidu on 16/5/13.
6+
// Copyright © 2016年 zxy. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
#import "AFNetworking.h"
11+
12+
/*!
13+
@brief API访问的处理状态,IDPServerAPI.state
14+
*/
15+
typedef enum {
16+
KT_PROC_STAT_CREATED = 1,
17+
KT_PROC_STAT_LOADING,
18+
KT_PROC_STAT_SUCCEED,
19+
KT_PROC_STAT_FAILED,
20+
KT_PROC_STAT_CANCELLED
21+
} KtProcessStateEnum;
22+
23+
/*!
24+
@brief Http请求方法
25+
@discussion POST方法
26+
@discussion GET方法ß
27+
*/
28+
typedef enum {
29+
KT_REQUEST_POST, // POST方法
30+
KT_REQUEST_GET, // GET方法
31+
} KtHttpRequestMethod;
32+
33+
// ServerAPI 的回调
34+
@class KtBaseServerAPI;
35+
typedef void(^KtServerAPICompletionBlock)(KtBaseServerAPI *);
36+
37+
@interface KtBaseServerAPI : NSObject
38+
39+
@property (nonatomic, strong) AFHTTPSessionManager *manager;
40+
41+
// request
42+
@property (nonatomic, readonly) NSString *server; // 形如 www.address.of.api,可兼容前面带“http://”、以及后面带“/”的情况
43+
@property (nonatomic, copy) NSString *api; // 形如 /some/api/to/access,可兼容前面不带“/”的情况
44+
@property (nonatomic, readonly) NSDictionary *reqParams; // 请求参数
45+
@property (nonatomic, readonly) NSDictionary *files; // 请求文件
46+
@property (nonatomic, copy) KtServerAPICompletionBlock userBlock; // serverapi回调的block
47+
48+
// response
49+
@property (nonatomic, retain) NSError *error; // code为IDPErrorEnum类型,服务器返回存放在userInfo的errno和errmsg里
50+
@property (nonatomic, retain) NSDictionary *jsonData; // 解析出的JSON
51+
@property (nonatomic, retain) NSData *rawData; // 原始data,用于二进制结果
52+
@property (nonatomic, readonly) NSString *rawString; // 原始字符串,用于文本结果,lazyloading
53+
@property (nonatomic, retain) id protobufParserData; // 服务器返回的protobuf解析后的数据
54+
55+
// state
56+
@property (nonatomic, assign) KtProcessStateEnum state;
57+
58+
// 性能信息
59+
@property (nonatomic, readonly) CFTimeInterval startTime; // 请求发起时间
60+
@property (nonatomic, readonly) CFTimeInterval netCost; // 网络耗时
61+
62+
- (id)initWithServer:(NSString *)server;
63+
64+
/*!
65+
@brief 访问API,子类不需要重载
66+
@discussion 本方法可重复调用,会自动中止当前请求(但并不调用用户回调)
67+
@discussion 回调调用时机:请求失败、请求被中止、请求成功
68+
@discussion 回调一般是根据state访问error或者parsedData,并关掉菊花
69+
70+
@param api 形如 /some/api/to/access,可兼容前面不带“/”的情况
71+
@param params 参数
72+
@param files 文件
73+
@param requestMethod KtHttpRequestMethod(GET/POST)
74+
@param block KtServerAPICompletionBlock 回调
75+
76+
*/
77+
- (void)accessAPI:(NSString *)api
78+
WithParams:(NSDictionary *)params
79+
files:(NSDictionary *)files
80+
requestMethod:(KtHttpRequestMethod)method
81+
completionBlock:(KtServerAPICompletionBlock)block;
82+
83+
/*!
84+
@brief 访问API,子类不需要重载 (DEFAULT POST METHOD)
85+
86+
@param api 形如 /some/api/to/access,可兼容前面不带“/”的情况
87+
@param params 参数
88+
@param files 文件
89+
@param block KtServerAPICompletionBlock 回调
90+
91+
*/
92+
- (void)accessAPI:(NSString *)api
93+
WithParams:(NSDictionary *)params
94+
files:(NSDictionary *)files
95+
completionBlock:(KtServerAPICompletionBlock)block;
96+
97+
/*!
98+
@brief 访问API, 省略files参数的版本
99+
100+
@param api 形如 /some/api/to/access,可兼容前面不带“/”的情况
101+
@param params 参数
102+
@param block KtServerAPICompletionBlock 回调
103+
104+
*/
105+
- (void)accessAPI:(NSString *)api
106+
WithParams:(NSDictionary *)params
107+
completionBlock:(KtServerAPICompletionBlock)block;
108+
109+
- (void)cancel;
110+
- (void)refresh;
111+
112+
@end
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
//
2+
// KtBaseServerAPI.m
3+
// KtTableView
4+
//
5+
// Created by baidu on 16/5/13.
6+
// Copyright © 2016年 zxy. All rights reserved.
7+
//
8+
9+
#import "KtBaseServerAPI.h"
10+
11+
@interface KtBaseServerAPI ()
12+
13+
@property (nonatomic, retain) NSString *server;
14+
@property (nonatomic, retain) NSDictionary *reqParams;
15+
@property (nonatomic, retain) NSDictionary *files;
16+
@property (nonatomic, assign) CFTimeInterval startTime;
17+
@property (nonatomic, assign) CFTimeInterval netCost;
18+
@property (nonatomic, strong) NSURLSessionDataTask *task;
19+
20+
@end
21+
22+
@implementation KtBaseServerAPI
23+
24+
@synthesize rawString = _rawString;
25+
26+
- (id)initWithServer:(NSString *)server {
27+
self = [super init];
28+
if (self) {
29+
if (![server hasPrefix:@"http://"]) {
30+
server = [@"http://" stringByAppendingString:server];
31+
}
32+
if ([server hasSuffix:@"/"]) {
33+
server = [server substringToIndex:server.length - 1];
34+
}
35+
self.server = server;
36+
}
37+
return self;
38+
}
39+
40+
#pragma -mark accessAPI
41+
42+
- (void)accessAPI:(NSString *)api
43+
WithParams:(NSDictionary *)params
44+
files:(NSDictionary *)files
45+
requestMethod:(KtHttpRequestMethod)method
46+
completionBlock:(KtServerAPICompletionBlock)block {
47+
if (!self.manager) {
48+
// 应该获取一个全局唯一的 manager
49+
self.manager = [AFHTTPSessionManager manager];
50+
self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
51+
self.manager.responseSerializer.acceptableContentTypes = [self.manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
52+
}
53+
54+
if (self.state == KT_PROC_STAT_LOADING) {
55+
[self cancel];
56+
}
57+
58+
self.netCost = 0; // 网络请求统计
59+
// 赋值
60+
if (![api hasPrefix:@"/"]) {
61+
self.api = [@"/" stringByAppendingString:api];
62+
} else {
63+
self.api = api;
64+
}
65+
self.reqParams = params;
66+
self.files = files;
67+
self.userBlock = block;
68+
69+
// 重置状态
70+
self.state = KT_PROC_STAT_CREATED;
71+
self.error = nil;
72+
self.jsonData = nil;
73+
self.rawData = nil;
74+
self.rawString = nil;
75+
76+
// 统计时间
77+
self.startTime = CFAbsoluteTimeGetCurrent();
78+
79+
// 允许子类调用自己的方法,附加请求参数
80+
81+
// 发起请求
82+
NSString *url = [self.server stringByAppendingString:self.api];
83+
if (method == KT_REQUEST_POST) {
84+
self.task = [self.manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
85+
self.netCost = CFAbsoluteTimeGetCurrent() - self.startTime; // 统计网络请求时间
86+
self.rawData = (NSData *)responseObject;
87+
self.jsonData = [NSJSONSerialization JSONObjectWithData:self.rawData options:NSJSONReadingMutableContainers error:nil];
88+
self.state = KT_PROC_STAT_SUCCEED;
89+
90+
if (self.userBlock) {
91+
self.userBlock(self);
92+
}
93+
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
94+
self.state = KT_PROC_STAT_FAILED;
95+
}];
96+
}
97+
else {
98+
// GET
99+
}
100+
self.state = KT_PROC_STAT_LOADING; // 状态设置为开始请求
101+
}
102+
103+
- (void)accessAPI:(NSString *)api
104+
WithParams:(NSDictionary *)params
105+
files:(NSDictionary *)files
106+
completionBlock:(KtServerAPICompletionBlock)block {
107+
[self accessAPI:api
108+
WithParams:params
109+
files:files
110+
requestMethod:KT_REQUEST_POST
111+
completionBlock:block];
112+
}
113+
114+
- (void)accessAPI:(NSString *)api
115+
WithParams:(NSDictionary *)params
116+
completionBlock:(KtServerAPICompletionBlock)block {
117+
[self accessAPI:api WithParams:params files:nil completionBlock:block];
118+
}
119+
120+
#pragma -mark 刷新与取消
121+
// 刷新请求
122+
- (void)refresh {
123+
[self accessAPI:self.api
124+
WithParams:self.reqParams
125+
files:self.files
126+
completionBlock:self.userBlock];
127+
}
128+
129+
// 中止请求
130+
- (void)cancel {
131+
if (self.state == KT_PROC_STAT_LOADING) {
132+
self.state = KT_PROC_STAT_CANCELLED;
133+
[self.task cancel];
134+
} else {
135+
// 提醒
136+
return;
137+
}
138+
}
139+
140+
// lazyloading
141+
- (NSString *)rawString {
142+
if (_rawString) {
143+
return _rawString;
144+
}
145+
if (self.rawData) {
146+
_rawString = [[[NSString alloc] initWithData:self.rawData encoding:NSUTF8StringEncoding] copy];
147+
}
148+
return self->_rawString;
149+
}
150+
151+
- (void)setRawString:(NSString *)rawString {
152+
if (self->_rawString == rawString) {
153+
return;
154+
}
155+
156+
self->_rawString = [rawString copy];
157+
}
158+
159+
@end

0 commit comments

Comments
 (0)