casatwy / ctnetworking Goto Github PK
View Code? Open in Web Editor NEWiOS networking API layer
License: Other
iOS networking API layer
License: Other
代理回调的地方,因为网络请求回来的数据,需要进行大量耗时的操作,可否像AF一样,做一个completionQueue属性?
(void)failedOnCallingAPI:(CTURLResponse *)response withErrorType:(CTAPIManagerErrorType)errorType
{
self.isLoading = NO;
if (response) {
self.response = response;
}
self.errorType = errorType;
[self removeRequestIdWithRequestID:response.requestId];
// user token 无效,重新登录
if (errorType == CTAPIManagerErrorTypeNeedLogin) {
[[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenIllegalNotification
object:nil
userInfo:@{
kCTUserTokenNotificationUserInfoKeyManagerToContinue:self
}];
return;
}
NSString *resCode = [NSString stringWithFormat:@"%@", response.content[@"resCode"]];
if ([resCode isEqualToString:@"00100009"]
|| [resCode isEqualToString:@"05111001"]
|| [resCode isEqualToString:@"05111002"]
|| [resCode isEqualToString:@"1080002"]
) {
[[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenIllegalNotification
object:nil
userInfo:@{
kCTUserTokenNotificationUserInfoKeyManagerToContinue:self
}];
return;
}
// 可以自动处理的错误
if (errorType == CTAPIManagerErrorTypeNeedAccessToken) {
[[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenInvalidNotification
object:nil
userInfo:@{
kCTUserTokenNotificationUserInfoKeyManagerToContinue:self
}];
return;
}
NSString *errorCode = [NSString stringWithFormat:@"%@", response.content[@"errorCode"]];
if ([response.content[@"errorMsg"] isEqualToString:@"invalid token"]
|| [response.content[@"errorMsg"] isEqualToString:@"access_token is required"]
|| [errorCode isEqualToString:@"BL10015"]
) {
// token 失效
[[NSNotificationCenter defaultCenter] postNotificationName:kCTUserTokenInvalidNotification
object:nil
userInfo:@{
kCTUserTokenNotificationUserInfoKeyManagerToContinue:self
}];
return;
}
// 常规错误
if (errorType == CTAPIManagerErrorTypeNoNetWork) {
self.errorMessage = @"无网络连接,请检查网络";
}
if (errorType == CTAPIManagerErrorTypeTimeout) {
self.errorMessage = @"请求超时";
}
if (errorType == CTAPIManagerErrorTypeCanceled) {
self.errorMessage = @"您已取消";
}
if (errorType == CTAPIManagerErrorTypeDownGrade) {
self.errorMessage = @"网络拥塞";
}
// 其他错误
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.interceptor respondsToSelector:@selector(manager:didReceiveResponse:)]) {
[self.interceptor manager:self didReceiveResponse:response];
}
if ([self beforePerformFailWithResponse:response]) {
[self.delegate managerCallAPIDidFailed:self];
}
if (self.failBlock) {
self.failBlock(self);
}
[self afterPerformFailWithResponse:response];
});
}
这段代码的编排在 issues 中显示有点奇怪, 望体谅;
Casatwy 大大, 我的疑问是 :
1.该方法中涉及到的 resCode, errorMsg 等 key 的判断是否是业务相关的数据?
2.如果是业务相关数据, 是否可以想 Target_CTAppContext 类似的方式来引入, 实现业务数据的分离?
使用NSUserDefaults.standardUserDefaults
来存储缓存数据个人觉得不合理. 由于请求数据可能很大, 比如一个很长的列表, 一旦数据量累计, 不仅速度堪忧, 而且会影响到其他使用standardUserDefaults
的模块. 退一步说, 即使要使用NSUserDefaults
, 也应该是创建一个独占的NSUserDefaults
.
if ((NSInteger)self != (NSInteger)self.interceptor && [self.interceptor respondsToSelector:@selector(manager:shouldCallAPIWithParams:)]) {
return [self.interceptor manager:self shouldCallAPIWithParams:params];
} else {
return YES;
}
大佬,APIManager的派生类遵循了YDLAPIManagerInterceptor协议 也设置了self.interceptor = self; 为什么派生类里面实现的协议方法总是走不到。 是不是你上面这个判断错误了啊?应该是等于:NSInteger)self == (NSInteger)self.interceptor,如果不等于永远走的都是else里面?。。。。。求解这个拦截器
我好像明白了,是要新类继承实现。那具体怎么做呢,求教大佬解答
CTApiProxy中
NSDictionary *result = [request.service resultWithResponseObject:responseObject response:response request:request error:&error];
如果上面返回的error是nil,对error取地址的话是有值的
接下来Demoservice中,提前返回了,造成请求成功时kCTApiProxyValidateResultKeyResponseObject里面的值为空,后面的请求结果拿不到值
`- (NSDictionary *)resultWithResponseObject:(id)responseObject response:(NSURLResponse *)response request:(NSURLRequest *)request error:(NSError **)error
{
NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
if (error || !responseObject) {
return result;
}
if ([responseObject isKindOfClass:[NSData class]]) {
result[kCTApiProxyValidateResultKeyResponseString] = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
result[kCTApiProxyValidateResultKeyResponseObject] = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:NULL];
} else {
//这里的kCTApiProxyValidateResultKeyResponseString是用作打印日志用的,实际使用时可以把实际类型的对象转换成string用于日志打印
// result[kCTApiProxyValidateResultKeyResponseString] = responseObject;
result[kCTApiProxyValidateResultKeyResponseObject] = responseObject;
}
return result;
}`
既然error是用于判断的,就不要写成 error:(NSError **)error这种形式,建议修改如下
NSDictionary *result = [request.service resultWithResponseObject:responseObject response:response request:request error:error];
- (NSDictionary *)resultWithResponseObject:(id)responseObject response:(NSURLResponse *)response request:(NSURLRequest *)request error:(NSError *)error
在进行网络请求用例测试时,发现无法进行缓存,打印日志查看最终定位到CTResponse初始化的时候
self.acturlRequestParams = request.actualRequestParams;
self.originRequestParams = request.originRequestParams;
这俩个方法的数据都是nil,不知道是方法错误还是是买问题,希望可以解释一下,谢谢
casa大神,你好,我想请教一个问题,后台返回格式是json格式,但是我在断点调试的时候CTApiProxy.m这个类中的接收数据是直接用data接收的,这样导致进入日志CTLogger类中的时候就会崩溃,请问是需要设置什么么
-> CTNetworking (1.0.0)
CTNetworking is an iOS discrete HTTP API calling framework based on
AFNetworking.
pod 'CTNetworking', '~> 1.0.0'
有这样一个需求,App 大量的请求需要依赖一个 ticket。
对这个 ticket 的设计是 30 分钟时效,要客户端自己做时间戳判断,过期就要先请求 ticket,再发本来的请求。
这样我无论如何都想不到比较优雅的方法在底层处理,不知大神有没有想法。
casatwy您好,看你博客收益匪浅,拜读完看到您关于网络层的文章,如雷灌顶,急切想追看您的PPT,无奈已经找不到了,愿请前辈再发放出来,晚辈不胜感激!
CTNetworking 能不能提供批量请求的API
如题,能稍微 不那么随意吗 方便大家学习理解每个commit 修改的意义
casa你好,首先非常感谢你提供这么灵活优雅的网络框架。
我在使用过程中遇到以下疑惑,还请指导:
谢谢!
框架只有Form表单的请求方式,入参必须是字典,请问如何优雅的扩展JSON MULTIPART的请求方式
比如一个控制器里面需要发送两次请求,需要写两个子类分别继承CTAPIBaseManager,然后再分别在子类中实现代理方法 (NSString *_Nonnull)methodName 等等吗?如果这样的话 感觉挺麻烦的,可不可以写一个CTAPIBaseManager子类 然后在代理方法中加参数,区分是哪个请求,再返回对应请求的methodName值.期待你的回复
I test CTNetworking ,it may not support upload image files ? is't it ?
or how can I do to support upload images ?thanks!
您好, 可否提供类图?
这样有利于更快速的理解项目中类之间的逻辑关系.
很好奇为什么不是直接在原来 RTNetworking 的基础上进行迭代,而是新开了个 repo?是因为改动会比较大的原因吗?
我看过PPT了,PPT中提到的组件,例如AIFService,AIFRequestGenerator,我在这个项目中并未找到,作者可以将完整的网络层源码发一份给我么?谢谢O(∩_∩)O
如果我实现了一个CTAPIBaseManager的子类A, 然后想通过类方法loadDataWithParams请求网络,这时只返回了requesId,没有实例调用CancelRequest。
AFHTTPSessionManager manager 不是单例,请求成功task没有收回,看到AF提问区有人回答需要调用 AFHTTPSessionManager 的 invalidateSessionCancelingTasks:resetSession: ,CTNetworking中并没有暴露AFHTTPSessionManager,所以是否需要在收到resultWithResponseObject:response:request:error:之前invalidateSessionCancelingTasks:resetSession:
当viewController死亡后,CTAPIBaseManager的dealloc并没有如期调用,需要等到请求完毕时,才会调用。
下面代码的闭包对CTAPIBaseManager对象进行了强引用,所以没有如期死亡。这也跟旧框架RTNetworking代码不同,现在是这样设计的吗?
CTNetworking代码:
NSNumber *requestId = [[CTApiProxy sharedInstance] callApiWithRequest:request success:^(CTURLResponse *response) {
[self successedOnCallingAPI:response];
} fail:^(CTURLResponse *response) {
CTAPIManagerErrorType errorType = CTAPIManagerErrorTypeDefault;
if (response.status == CTURLResponseStatusErrorCancel) {
errorType = CTAPIManagerErrorTypeCanceled;
}
if (response.status == CTURLResponseStatusErrorTimeout) {
errorType = CTAPIManagerErrorTypeTimeout;
}
if (response.status == CTURLResponseStatusErrorNoNetwork) {
errorType = CTAPIManagerErrorTypeNoNetWork;
}
[self failedOnCallingAPI:response withErrorType:errorType];
}];
RTNetworking代码:
#define AXCallAPI(REQUEST_METHOD, REQUEST_ID)
{
__weak typeof(self) weakSelf = self;
REQUEST_ID = [[CTApiProxy sharedInstance] call##REQUEST_METHOD##WithParams:apiParams serviceIdentifier:self.child.serviceType methodName:self.child.methodName success:^(CTURLResponse *response) {
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf successedOnCallingAPI:response];
} fail:^(CTURLResponse *response) {
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf failedOnCallingAPI:response withErrorType:CTAPIManagerErrorTypeDefault];
}];
[self.requestIdList addObject:@(REQUEST_ID)];
}
- (void)saveMemoryCacheWithResponse:(CTURLResponse *)response serviceIdentifier:(NSString *)serviceIdentifier methodName:(NSString *)methodName cacheTime:(NSTimeInterval)cacheTime { if (response.originRequestParams && response.content && serviceIdentifier && methodName) { [self.memoryCacheCenter saveCacheWithResponse:response key:[self keyWithServiceIdentifier:serviceIdentifier methodName:methodName requestParams:response.originRequestParams] cacheTime:cacheTime]; } }
请求没有参数时,originRequestParams
为空就没办法缓存了。处于什么考虑呢?
求大神指教:GET /topics/:id.json 类似这种的接口,CTNetworking里要怎么写呢?
还有就是response里的content有时不一定是字典可能是数组,这个要怎么处理好呢我现在是强转了
(id)CT_defaultValue:(id)defaultData
{
if (![defaultData isKindOfClass:[self class]]) {
//此处判断由于defaultData为__NSCFConstantString
//self为NSTaggedPointerString,由于类型不同,导致不能准确打印参数
return defaultData;
}
if ([self CT_isEmptyObject]) {
return defaultData;
}
return self;
}
curl -X POST -H "User-Agent: CTNetworking/1.0 (iPhone; iOS 13.1.2; Scale/2.00)" -H "Content-Type: application/json" -H "Accept-Language: zh-Hans-HK;q=1" -d 'appid=12&isfresh=1' http://hmservice.ggfw.hzcgw.gov.cn/hzFullAPPServiceDev/exhibitionmenu/getmenuList.do
报错信息如下:
{"code":500,"msg":"appid不能为空","obj":null,"success":false}%
iOS应用架构谈,年前拜读了两篇文章,反复看了好几遍,包括评论部分,有茅塞顿开的感觉,年后再看,就访问不了了。
能否有时间把上传,下载加上
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.