网络请求类的封装思想:鄙人理解是,就是在AFNetWorking或者MKNetWork的基础上在封装一层,抽离出一个中间层。如果项目以后需要换网络请求,我们只在中间层修改,项目中的网络请求不用修改,这也就是封装的好处吧
1.1首先拿到后台的文档,仔细阅读文档,注意接口参数的说明(哪些参数是必传,哪些参数是可选项)
1.2请求及时间的格式
1.3接口的请求方式(一般是GET POST请求)
1.4接口响应数据的格式(一般是以Json格式返回数据)
1.5接口输出状态的说明(成功返回什么,失败返回什么)
1.6注意接口的地址
以上信息看完以后,我们必须在xcode中来完成以下操作
2.1首先把AFNetWorking网络请求类导入到工程中,编译xcode看有没有错误(如果有错误检查排除)
2.2创建一个网络请求类,(这个网络请求类可以继承NSObject或者
AFHTTPRequestOperationManager
)也应该可以
例如:网络请求类:鄙人命名为这个,
ELifeNetAPIClient
在这个类的.h文件中,写一个单例方法
+ (instancetype)sharedClient;(用单例的好处就是,保证网络请求类在这个类中之创建一次,避免资源浪费)
2.2.1然后POST请求 GET请求 各自写一个方法
POST
/**
* 请求方法
* NOTE: 使用POST方式
*/
- (AFHTTPRequestOperation*)requestPostWithType:(NSString*)type args:(NSDictionary*)args success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure;
GET
/**
* 请求方法
* NOTE: 使用GET方式
*/
- (AFHTTPRequestOperation*)requestGetWithType:(NSString*)type args:(NSDictionary*)args success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure;
写完以上方法后在.m文件中实现以上三个方法
首先是单例
+ (instancetype)sharedClient
{
static ELifeNetAPIClient *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedClient = [[ELifeNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:NetAPIBaseURLString]];
});
return _sharedClient;
}
其次POST方法
- (AFHTTPRequestOperation *)requestPostWithType:(NSString*)type args:(NSDictionary*)args success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure
{
AFHTTPRequestOperation* op = [self POST:type
parameters:args
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"data=%@",operation.responseString);
assert([responseObject isKindOfClass:NSDictionary.class]);
NSError* error = nil;
NSString *status = [responseObject objectForKey:@"respCode"];
NSString *message = [responseObject objectForKey:@"respMsg"];
if ([status isEqualToString:@"0000"]) {
success(responseObject);
}else{
error = [NSError errorWithDomain:message code:[status integerValue] userInfo:nil];
failure(error);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
error = [NSError errorWithDomain:@"网络错误" code:9999 userInfo:nil];
NSLog(@"error: %@", error.description);
failure(error);
}];
return op;
}
最后GET方法
- (AFHTTPRequestOperation*)requestGetWithType:(NSString*)type args:(NSDictionary*)args success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure
{
NSLog(@"path=%@ args:%@", type, args);
AFHTTPRequestOperation* op =[self GET:type
parameters:args
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"data=%@", responseObject);
assert([responseObject isKindOfClass:NSDictionary.class]);
NSError* error = nil;
NSString *status = [responseObject objectForKey:@"respCode"];
NSString *message = [responseObject objectForKey:@"respMsg"];
if ([status isEqualToString:@"0000"]) {
success(responseObject);
}else{
error = [NSError errorWithDomain:message code:[status integerValue] userInfo:nil];
NSLog(@"error: %@", error.domain);
failure(error);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
error = [NSError errorWithDomain:@"网络错误" code:9999 userInfo:nil];
NSLog(@"error: %@", error.description);
failure(error);
}];
return op;
}
3.0在创建一个类用于封装网络的接口