前言:
(本文编辑于:2020-08-19)
IOS的文章,今天,再来补一篇,Sagit的教程;
Sagit 开源地址:https://github.com/cyq1162/Sagit
今天主要是分享网络请求,即STHttp的用法:
STHttp为处理网络API请求的功能的源码。
1、对外API功能调用说明:
目前对外调用的API:
typedef void(^Success)(STHttpModel *result); typedef void(^Error)(NSString *errMsg); typedef void(^Before)(NSMutableURLRequest *request); //!提供基础的网络请求(get、post、upload(图片上传)) @interface STHttp : NSObject //!消息弹窗。 @property (nonatomic,strong) STMsgBox *msgBox; //!请求的默认编码:默认Utf8 @property (nonatomic,assign) NSStringEncoding defautEncoding; - (instancetype)init:(STMsgBox*)msgBox; + (STHttp*)share; #pragma mark 调用方法 - (void)get:(NSString *)url paras:(NSDictionary *)paras success:(Success)succese; - (void)get:(NSString *)url paras:(NSDictionary *)paras success:(Success)success error:(Error)error; - (void)get:(NSString *)url paras:(NSDictionary *)paras before:(Before)before success:(Success)success; - (void)get:(NSString *)url paras:(NSDictionary *)paras before:(Before)before success:(Success)success error:(Error)error; - (void)post:(NSString *)url paras:(NSDictionary *)paras success:(Success)success; - (void)post:(NSString *)url paras:(NSDictionary *)paras success:(Success)success error:(Error)error; - (void)post:(NSString *)url paras:(NSDictionary *)paras before:(Before)before success:(Success)success; - (void)post:(NSString *)url paras:(NSDictionary *)paras before:(Before)before success:(Success)success error:(Error)error; - (void)upload:(NSString *)url paras:(id)dicOrNSData success:(Success)success; - (void)upload:(NSString *)url paras:(id)dicOrNSData success:(Success)success error:(Error)error; - (void)upload:(NSString *)url paras:(id)dicOrNSData before:(Before)before success:(Success)success; - (void)upload:(NSString *)url paras:(id)dicOrNSData before:(Before)before success:(Success)success error:(Error)error; #pragma mark 全局可覆盖方法 //!全局追加默认请求头(覆盖方法) -(void)globalHeader:(NSMutableURLRequest*)request; //!全局修改默认请求URL(覆盖方法) -(NSString*)globalSetUrl:(NSString*)url; @end
只有三个常用的方法:get、post、upload(图片)。
对于框架未封装的:进度呈现、文件下载、有需要用到的,可以自己用扩展方法补充。
2、调用方式
对于该类的调用方式,有两种
1、在继承自STController的控制器下,直接用[self.http ...]
STController这个基类,默认实现的有两个子类接口(msgBox:消息弹窗、http:网络请求)
例如:
[self.http get:UrlQuestionRank paras:nil success:^(STHttpModel *result) { if (result.success) { NSMutableArray<id> *data=(NSMutableArray<id>*)result.msg[@"data"]; STFirstTable.source=data; [STFirstTable reloadData]; } }];
2、在任意地方,都可以全局的调用:用[Sagit.Http ...]
Sagit,是一个总类库的起始名称空间,很多常用功能,都是由Sagit打开头开始,后续会单独介绍。
例如:
//获取积分 [Sagit.Http get:UrlIntegralShareBlog paras:nil success:^(STHttpModel *result) { if(result.success && result.msg) { NSString *data=(NSString*)result.msg; if(data && data.isInt) { //修改当前积分总数 Sagit.Global.User.user.Integral=data.integerValue; } } }];
3、需要设置请求头的地方,可以用带有before的重载方法:
NSDictionary *postDic=@{@"uid":@"13400000001",@"pwd":@"12345"};//,@"img":data [h2 post:@"http://192.168.0.116/auth/hello" paras:postDic before:^(NSMutableURLRequest *request) { [request addValue:@"post.." forHTTPHeaderField:@"post."]; } success:^(STHttpModel *result) { [self.msgBox prompt:result.msgString]; }];
3、项目代码实例
下面,会和大伙分享 IT连App 中,应用到该相关的代码:
A、get用法:加载用户信息
-(void)loadUserInfo:(NSString*)userID loadComplete:(LoadComplete)loadComplete { if(![NSString isNilOrEmpty:self.Token]) { NSMutableDictionary *dic=nil; if(![NSString isNilOrEmpty:userID]) { dic=@{@"UserID":userID}; } //检测有没有缓存 if(userID) { PersonalModel *mode=[Sagit.Cache get:userID]; if(mode) { loadComplete(mode); return; } } [Sagit.Http get:UrlUserInfo paras:dic success:^(STHttpModel *result) { PersonalModel *user=nil; if(result.success) { user = [[PersonalModel alloc] initWithObject:result.msg]; } if(user && userID==nil){self.User=user;} else { [Sagit.Cache set:userID value:user]; } if(loadComplete!=nil) { loadComplete(user); } }]; } else if(loadComplete!=nil) { loadComplete(nil); } }
木有效果图〜
B、post用法:登陆账号
- (void)LoginClick:(UIButton *)sender { if(![self isMatch:@"手机号" name:@"UserName" regex:RexMobile] || ![self isMatch:@"密码" name:@"password" regex:nil] ) { return; } NSMutableDictionary *para = [self formData]; [para setValue:@(UserAccountType) forKey:@"AccountType"]; [self.http post:UrlLogin paras:para success:^(STHttpModel *result) { if (result.success) { Sagit.Global.Token=(NSString *)result.msg; [STNew(@"MainController") asRoot]; }else { [self.msgBox prompt:(NSString *)result.msg]; } }]; }
界面图:
C、upload用法:上传图片
- (void)headImageClick:(UIButton*)btn { [btn.imageView pick:^(NSData *data, UIImagePickerController *picker, NSDictionary<NSString *,id> *info) { [self.http upload:UrlUploadPhoto paras:@{@"photo":data,@"PhotoType":@"2"} success:^(STHttpModel *result) { if (result.success) { [self key:@"uploadPhoto" value:@"1"]; [self.msgBox prompt:@"头像上传成功!"]; [btn image:data];// corner:YES]; }else { [self.msgBox prompt:@"头像上传失败!"]; } }]; } edit:YES]; }
界面图:
4、返回结果的实体类
STModel,是约定好格式的结果。
已更名为:STHttpModel
@interface STHttpModel : STModelBase @property (nonatomic, assign) BOOL success; @property (retain, nonatomic) id<NSObject> msg;
//将msg转成dictionary返回
@property (retain, nonatomic,readonly) NSDictionary* msgDic;
//将msg转成Array返回
@property (retain, nonatomic,readonly) NSArray* msgArray;
//将msg转成string返回
@property (copy, nonatomic,readonly) NSString* msgString;
@end
msg,可以根据具体返回的数据,获取对应的类型。
5、IT连中的对STHttp进行了扩展使用
下面和大伙分享一下:IT连的都是扩展了点什么:
A、对于定义API的URL,都简化了前缀
/** 注册 */ #define UrlReg @"/user/register" /** 登陆 */ #define UrlLogin @"/user/login"
将前缀的主机部分,由扩展功能完成。
所以扩展重写了:globalSetUrl函数:
@implementation STHttp(IT) -(NSString*)globalSetUrl:(NSString *)url { if(![url hasPrefix:@"http://"] && ![url hasPrefix:@"https://"]) { if([url startWith:@"/photos/"] || [url startWith:@"/qrcode/"]) { url=[ImageHost append:url]; } else { url=[ApiHost append:url]; } } return url; }
B、扩展中重写了:globalSetHeader功能,用于设置一些固定的请求头。
//!全局追加默认请求头(覆盖方法) -(void)globalHeader:(NSMutableURLRequest*)request { [request addValue:AppVersionNum forHTTPHeaderField:@"ver"]; [request addValue:[self createAck] forHTTPHeaderField:@"ack"]; [request addValue:STNumString(AppProdType) forHTTPHeaderField:@"prod"]; if(Sagit.Global.Token) { [request addValue:Sagit.Global.Token forHTTPHeaderField:@"token"]; } }
C、扩展中重写了:showError,用于统一显示网络请求的错误信息。
-(void)showError:(NSString*)errMsg { if(self.msgBox!=nil) { [self.msgBox alert:@"网络连接错误"]; } }
其它:增加两个全局扩展方法:(2020-12-01)
-(BOOL)globalBeforeSuccess:(STHttpModel*)model;
-(BOOL)globalBeforeError:(NSString*)errorMsg;
作用:比如全局api请求都要进行返回特定参数判断,然后处理流程。
总结:
本篇虽然介绍的是网络请求,但分享的代码,也都是IT连里完整的功能模块了。
Sagit框架,让IOS开发更简单,你值的拥有!!!
顺便新开:IOS Sagit 开发框架 QQ群:702724292
版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。 |
个人微信公众号 |
Donation(扫码支持作者):支付宝: |
Donation(扫码支持作者):微信: |