1. 程式人生 > >Sagit.Framework For IOS 開發框架入門教程6:網路請求STHttp

Sagit.Framework For IOS 開發框架入門教程6:網路請求STHttp

前言:

IOS的文章,今天,再來補一篇,Sagit的教程;

雖然感覺IOS的文章沒什麼觀眾,還是努力寫吧,-_-〜

今天主要是分享網路請求,即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[email protected]{@"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