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


    前言:

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

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

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

    今天主要是分享网络请求,即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];
            }
        }];
    }

    界面图:

    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:^(STModel *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,是约定好格式的结果。

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

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

    5、IT连中的对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

  • 相关阅读:
    springboot整合邮件发送(163邮箱发送为例)
    MySQL 容器修改配置文件后无法启动问题(终极解决办法)
    SQLyog无操作一段时间后重新操作会卡死问题(解决办法)
    Linux中配置端口转发(反向代理)
    SpringBoot之整合Quartz调度框架-基于Spring Boot2.0.2版本
    shell脚本报错:-bash: xxx: /bin/sh^M: bad interpreter: No such file or directory
    用xshell连接linux服务器失败 Could not connect to '112.74.73.194' (port 22): Connection failed.
    GooglePlay的多apk命令行安装
    trojan阉割备份
    网易云音乐本地数据库的歌单列表导出,一个不丢,支持1000首以上
  • 原文地址:https://www.cnblogs.com/cyq1162/p/8665502.html
Copyright © 2020-2023  润新知