Sagit.Framework For IOS 开发框架入门教程6:网络请求STHttp

前言:

IOS的文章,今天,再来补一篇,Sagit的教程;

虽然感觉IOS的文章没什么观众,还是努力写吧,-_-〜

Sagit 开源地址:https://github.com/cyq1162/Sagit

今天主要是分享网络请求,即STHttp的用法:

Sagit.Framework For IOS 开发框架入门教程6:网络请求STHttp

STHttp为处理网络API请求的功能的源码。

1、对外API功能调用说明:

对于网络请求,Sagit目前是对AFNetworking做了一下二次封装!

所以框架里有引用到这个第三方组件。

封装完后,目前对外调用的API:

typedef void(^Success)(STModel *result);
typedef void(^Error)(NSString *errMsg);
//!提供基础的网络请求(get、post、upload(图片上传))
@interface STHttp : NSObject @property (nonatomic,strong) STMsgBox *msgBox; - (instancetype)init:(STMsgBox*)msgBox;
- (void)get:(NSString *)url paras:(NSDictionary *)paras success:(Success)succese;
- (void)get:(NSString *)url paras:(NSDictionary *)paras 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)upload:(NSString *)url data:(NSData *)data success:(Success)success;
- (void)upload:(NSString *)url data:(NSData *)data success:(Success)success error:(Error)error; - (void)upload:(NSString *)url paras:(NSDictionary *)paras success:(Success)success;
- (void)upload:(NSString *)url paras:(NSDictionary *)paras success:(Success)success error:(Error)error;
- (void)setHeader:(NSString*)key v:(NSString*)value; + (instancetype)share;
+ (instancetype)shareWithLoading;
//-(void)networkState;
@end

只有三个常用的方法:get、post、upload(图片)。

2、调用方式

对于该类的调用方式,有两种

1、在继承自STController的控制器下,直接用[self.http ...]

STController这个基类,默认实现的有两个子类接口(msgBox:消息弹窗、http:网络请求)

例如:

[self.http get:UrlQuestionRank paras:nil success:^(STModel *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:^(STModel *result)
{
if(result.success && result.msg)
{
NSString *data=(NSString*)result.msg;
if(data && data.isInt)
{
//修改当前积分总数
Sagit.Global.User.user.Integral=data.integerValue;
}
}
}];

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:^(STModel *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:^(STModel *result)
{ if (result.success) {
Sagit.Global.Token=(NSString *)result.msg;
[STNew(@"MainController") asRoot];
}else {
[self.msgBox prompt:(NSString *)result.msg];
}
}];
}

界面图:

Sagit.Framework For IOS 开发框架入门教程6:网络请求STHttp

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":@""} success:^(STModel *result) {
if (result.success) {
[self key:@"uploadPhoto" value:@""];
[self.msgBox prompt:@"头像上传成功!"];
[btn image:data];// corner:YES];
}else {
[self.msgBox prompt:@"头像上传失败!"];
}
}]; } edit:YES];
}

界面图:

Sagit.Framework For IOS 开发框架入门教程6:网络请求STHttp

4、返回结果的实体类

STModel,是约定好格式的结果。

Sagit.Framework For IOS 开发框架入门教程6:网络请求STHttp

@interface STModel : STModelBase
@property (nonatomic, assign) BOOL success;
@property (retain, nonatomic) id<NSObject> msg; @end

msg,可以根据具体返回的数据,进行对应的类型转换。

5、IT连中的对STHttp进行了扩展使用

Sagit.Framework For IOS 开发框架入门教程6:网络请求STHttp

下面和大伙分享一下:IT连的都是扩展了点什么:

A、对于定义API的URL,都简化了前缀

/** 注册 */
#define UrlReg @"/user/register"
/** 登陆 */
#define UrlLogin @"/user/login"

将前缀的主机部分,由扩展功能完成。

所以扩展重写了:reSetUrl函数:

@implementation STHttp(IT)

-(NSString*)reSetUrl:(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;
}
-(void)reSetHeader
{
[self setHeader:@"ver" v:AppVersionNum];
[self setHeader:@"prod" v:STNumString(AppProdType)];
if(Sagit.Global.Token)
{
[self setHeader:@"token" v:Sagit.Global.Token];
}
}
-(void)showError:(NSString*)errMsg
{
if(self.msgBox!=nil)
{
[self.msgBox alert:@"网络连接错误"];
}
}

B、扩展中重写了:reSetHeader功能,用于设置一些固定的请求头。

C、扩展中重写了:showError,用于统一显示网络请求的错误信息。

总结:

本篇虽然介绍的是网络请求,但分享的代码,也都是IT连里完整的功能模块了。

Sagit框架,让IOS开发更简单,你值的拥有!!!

顺便新开:IOS Sagit 开发框架 QQ群:702724292

上一篇:ListView 选择多项目返回的之前的那项


下一篇:vijos 1512