介紹
新的App總是可以做一些新的嘗試,正好自己在項目中遇到了這個機會,整理開發(fā)了一套新的網(wǎng)絡(luò)庫API-- Ortrofit。 Ortrofit是一個在AFNetworking前端網(wǎng)絡(luò)網(wǎng)絡(luò)框架的基礎(chǔ)之上封裝出來的一套新的網(wǎng)絡(luò)API框架。它的主要思想源于安卓的基于OkHttp封裝出來的Retrofit,因此取名為Ortrofit也是為了向其致敬。Ortrofit旨在使用Annotation的方式簡潔的描述一個網(wǎng)絡(luò)請求的API,并在Request和Response中實現(xiàn)自定義的AOP攔截,同時也增加了對于RAC的支持。
依賴
- pod 'AFNetworking', '3.1.0'
- pod 'ReactiveCocoa', '2.5'
開始
創(chuàng)建并配置一個Ortrofit
Ortrofit *ortrofitInstance = Ortrofit.new.baseURL(@"https://oriente.com/")
.sessionTaskFactory([OrtroSessionTaskFactory new])
.callFactories(@[[OrtroRACCallAdaptorFactory new],
[OrtroCallAdaptorFactory new]])
.headers(@{@"mobile-agent":@"xxx"})
.requestTimeOut(@(30.0f));
通過上面??代碼可以創(chuàng)建一個Ortrofit并進行了常規(guī)的配置, 建議業(yè)務(wù)使用時只需要一個 Ortrofit 實例。
- baseURL: 網(wǎng)絡(luò)請求連接中前面相同的部分可以提前配置,后面的請求API只需要配置Path即可。
- OrtroSessionTaskFactory: 工廠方法,可以被業(yè)務(wù)層繼承并復(fù)寫,默認返回一個NSURLSessionTask的實例。
- OrtroRACCallAdaptorFactory: 工廠方法,繼承自OrtroCallAdaptorFactory在其 -(id)adapt: 方法內(nèi)包裝了OrtroCall并返回了RACSignal實例。
- OrtroCallAdaptorFactory: OrtroCall的默認工廠方法,接受OrtroCall 實例并直接返回不作處理。
網(wǎng)絡(luò)服務(wù)定義
@class RACSignal;
@class OrtroCall;
@interface UserService : NSObject
- (RACSignal*)getUserInfo:(NSString *) idNO;
- (OrtroCall*)setUserInfo:(NSString *) phoneNO name:(NSString *) name;
@end
#import "OrtroMicro.h"
@implementation UserService
@EXPORT_API(getUserInfo_){
BEGIN
@ReturnType(RACSignal)
@Method(GET)
@Path(user/getuserinfo)
@ParameterName(idNO)
END
}
- (RACSignal*)getUserInfo:(NSString *)idNO{ return nil; }
@EXPORT_API(setUserInfo_name_){
BEGIN
@ReturnType(OrtroCall)
@Method(POST)
@Path(user/setuserinfo)
@ParameterName(phoneNO)
@ParameterName(name)
END
}
- (OrtroCall*)setUserInfo:(NSString *)phoneNO name:(NSString *)name { return nil; }
@end
上面代碼創(chuàng)建了一個UserService的服務(wù)類,里面包含了根據(jù)用戶id獲取用戶信息和設(shè)置用戶信息兩個接口,第一個接口返回一個RACSignal實例,第二個接口返回OrtroCall實例。
- @EXPORT_API: 必須添加,根據(jù)傳人的方法名參數(shù)定位這些配置參數(shù)是應(yīng)用到具體哪一個網(wǎng)絡(luò)請求API,參數(shù)名就是API的SEL名并把":"替換成"_"。
- BEGIN / END: 必須添加,表示API描述的開始和結(jié)束。
- @ReturnType: 必須添加(除:OrtroCall),表示API返回的類型。
- @Method: 必須添加,網(wǎng)絡(luò)請求的類型,如:GET、POST。
- @Path: 必須添加,網(wǎng)絡(luò)請求的Path路徑。
- @ParameterName: 如果有參數(shù)必須添加,網(wǎng)絡(luò)請求的參數(shù)名稱定義,與API的入?yún)㈨樞蛞恢隆?/li>
更多支持
- @Path
除了支持常規(guī)的url外,還支持路徑上參數(shù){xxx}的解析,如:
@Path(user/{phoneNO}/getuserinfo)
請求路徑上面的參數(shù)會和 @ParameterName一起排序后與API的請求參數(shù)值進行合并。
- @Header
對于單個請求需要設(shè)置特殊的請求頭信息也是可以支持的,如:
@Header(@"language":@"CN")
網(wǎng)絡(luò)服務(wù)調(diào)用
業(yè)務(wù)場景中進行網(wǎng)絡(luò)服務(wù)調(diào)用無需再去記住各式各樣的Path,拼裝各種參數(shù),只需要知道需要調(diào)用某個服務(wù)的某個API即可直接調(diào)用,如:
//RAC 調(diào)用的例子
UserService *user = [ortrofit create:[UserService class]];
[user getUserInfo:@"1234"] subscribeNext:^(id x) {
NSLog(@"success");
}];
//常規(guī) 調(diào)用的例子
UserService *user = [ortrofit create:[UserService class]];
OrtroCall *call = [user setUserInfo:@"1234567" name:@"mathew"];
[call enqueue:^(NSURLResponse *urlResponse, id responseObject) {
NSLog(@"success");
} failure:^(NSURLResponse *urlResponse, id responseObject, NSError *error) {
NSLog(@"failure");
}];
源碼地址
https://github.com/Oriente-iOS/Ortrofit
更多
這個框架投入使用不久,后續(xù)還有很多功能會不斷添加進去,比如:緩存,下載等等。各位看官如果發(fā)現(xiàn)其中有些問題和需要優(yōu)化的地方也可以告知在下,謝謝!