前言:

(本文编辑于: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

posted on 2018-03-29 14:10  路过秋天  阅读(1162)  评论(0编辑  收藏  举报
路过秋天