Files
2022-03-21 11:16:38 +08:00

227 lines
5.8 KiB
Objective-C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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