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