// // PhalApiClient.m // PhalApiClientDemo // // Created by Aevit on 15/10/17. // Copyright © 2015年 Aevit. All rights reserved. // #import "PhalApiClient.h" @interface PhalApiClient() @end @implementation PhalApiClient - (instancetype)init { self = [super init]; if (self) { [self commonInit]; } return self; } - (void)commonInit { [self reset]; /** * 如果整个客户端只有一个接口host,可以在reset后设置好host,这样外部就可以不用调用withHost方法了 * e.g. [self withHost:@"http://api.your_host.com/project_name/"]; */ } #pragma mark - generate a client /** * 生成单例 * * @return 单例PhalApiClient */ + (PhalApiClient*)sharedClient { static PhalApiClient *_sharedClient; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[PhalApiClient alloc] init]; }); return _sharedClient; } /** * 生成非单例 * * @return 非单例PhalApiClient */ + (PhalApiClient*)create { PhalApiClient *client = [[PhalApiClient alloc] init]; return client; } #pragma mark - configure url and params /** * 重复查询时须重置请求状态,包括接口服务名称、接口参数和超时时间 * * @return PhalApiClient实例 */ - (PhalApiClient*)reset { self.host = nil; self.service = nil; self.params = nil; self.timeout = 0; return self; } /** * 设置接口域名 * 如果整个客户端只有一个接口host,可以在"commonInit"方法设置好host,这样外部就可以不用调用withHost方法了 * * @param host 域名 * * @return PhalApiClient实例 */ - (PhalApiClient*)withHost:(NSString*)host { self.host = nil; self.host = host; return self; } - (NSString *)host { if ([[_host substringFromIndex:(_host.length - 1)] isEqualToString:@"/"]) { return _host; } _host = [NSString stringWithFormat:@"%@/", _host]; return _host; } /** * 设置将在调用的接口服务名称,如:Default.Index * * @param service 接口服务名称 * * @return PhalApiClient实例 */ - (PhalApiClient*)withService:(NSString*)service { self.service = nil; self.service = service; return self; } /** * 设置接口参数,此方法是唯一一个可以多次调用并累加参数的操作 * * @param params 参数 * * @return PhalApiClient实例 */ - (PhalApiClient*)withParams:(NSDictionary*)params { self.params = nil; if (!params) { return self; } self.params = [NSMutableDictionary dictionaryWithDictionary:params]; return self; } /** * 设置过滤器,与服务器的DI().filter对应 * * @return PhalApiClient实例 */ - (PhalApiClient*)withFilter:(PhalApiClientFilter*)filter { self.filter = filter; return self; } /** * 设置超时时间,单位毫秒 * * @param timeout 超时时间,单位秒 * * @return PhalApiClient实例 */ - (PhalApiClient*)withTimeout:(float)timeout { self.timeout = timeout; return self; } - (float)timeout { // 默认60s超时 return (_timeout > 0 ? _timeout : 60); } #pragma mark - request /** * 发起接口请求(POST请求) * * @param completeBlock 请求成功的回调 * @param failureBlock 请求失败的回调 * * @return 请求实例 */ - (id)request:(HttpCompleteBlock)completeBlock failureBlock:(HttpFailureBlock)failureBlock { /** * 请求方式,可以使用系统的NSURLSession,或第三方的网络请求库等 * 这里我们使用第三方的AFNetworking,进行二次封装(https://github.com/AFNetworking/AFNetworking) * 新建子类(AFNPhalApiClient,继承自PhalApiClient),重写此request方法 * 如需使用其他网络请求方式(如NSURLSession),请继承自PhalApiClient,重写此request即可,可参考AFNPhalApiClient */ return [self requestWithFormDataBlock:nil completeBlock:completeBlock failureBlock:failureBlock]; } /** * 发起接口请求(提交表单) * * @param formDataBlock 表单内容 * @param completeBlock 请求成功的回调 * @param failureBlock 请求失败的回调 * * @return 请求实例 */ - (id)requestWithFormDataBlock:(FormDataBlock)formDataBlock completeBlock:(HttpCompleteBlock)completeBlock failureBlock:(HttpFailureBlock)failureBlock { /** * 请求方式,可以使用系统的NSURLSession,第三方的网络请求库等 * 这里我们使用第三方的AFNetworking,进行二次封装(https://github.com/AFNetworking/AFNetworking) * 新建子类(AFNPhalApiClient,继承自PhalApiClient),重写此request方法 * 如需使用其他网络请求方式(如NSURLSession),请继承自PhalApiClient,重写此request即可,可参考AFNPhalApiClient */ return nil; } #pragma mark - utils /** * 以get形式打印整个url,方便服务端开发人员调试 * * @return 整个url */ - (NSString*)printTotalUrlStr { if (!_host || _host.length <= 0) { return @"empty host"; } NSMutableString *finalStr = [NSMutableString stringWithString:_host]; [finalStr appendFormat:@"?service=%@&", _service]; if (_params) { for (NSString *key in [_params allKeys]) { [finalStr appendString:key]; [finalStr appendString:@"="]; id value = [_params objectForKey:key]; NSString *valueStr = @""; if ([value isKindOfClass:[NSNumber class]]) { valueStr = [value stringValue]; } else if ([value isKindOfClass:[NSString class]]) { valueStr = value; } else { PALog(@"什么鬼?!"); } [finalStr appendString:valueStr]; [finalStr appendString:@"&"]; } } return [finalStr substringWithRange:NSMakeRange(0, finalStr.length - 1)]; } @end