基于AFNetworking3.0網絡封裝
來自: http://www.henishuo.com/base-on-afnetworking3-0-wrapper/
前言
對于開發人員來說,學習網絡層知識是必備的,任何一款 App 的開發,都需要到網絡請求接口。很多朋友都還在使用原生的 NSURLConnection 一行一行地寫,代碼到處是,這樣維護起來更困難了。
對于使用 AFNetworking 的朋友來說,很多朋友都是直接調用 AFNetworking 的 API ,這樣不太好,無法做到全工程統一配置。
最好的方式就是對網絡層再封裝一層,全工程不允許直接使用 AFNetworking 的 API ,必須調用我們自己封裝的一層,如此一來,任何網絡配置都可以在這一層里配置好,使用的人無須知道里面在干嘛,只管調用就可以了。
本篇為基于AFNetworking3.0的版本,支持iOS7及其以上版本。若要支持iOS6,請閱讀舊版本: http://www.henishuo.com/base-on-afnetworking-wrapper/
常用接口類型
應用開發過程中,所使用類型通常是 GET 、 POST 及上傳圖片。因此,這里只是對這幾種類型提供 API 。
GET接口
這里提供了兩個 GET 請求的 API ,需要一般情況下 GET 請求都是直接寫一個完整的 URL ,但是有時候為了參數可讀性更強,改成傳一個字典過來更容易閱讀。
HYBResponseSuccess 是響應成功的回調,返回的是字典,外部再轉換成模型就可以了。
HYBResponseFail 是響應失敗的回調,只有一個 NSError 對象,外部可接收處理。
/*! * @author 黃儀標, 15-11-15 13:11:50 * * GET請求接口,若不指定baseurl,可傳完整的url * * @param url 接口路徑,如/path/getArticleList?categoryid=1 * @param success 接口成功請求到數據的回調 * @param fail 接口請求數據失敗的回調 * * @return 返回的對象中有可取消請求的API */ + (HYBURLSessionTask *)getWithUrl:(NSString *)url success:(HYBResponseSuccess)success fail:(HYBResponseFail)fail; /*! * @author 黃儀標, 15-11-15 13:11:50 * * GET請求接口,若不指定baseurl,可傳完整的url * * @param url 接口路徑,如/path/getArticleList * @param params 接口中所需要的拼接參數,如@{"categoryid" : @(12)} * @param success 接口成功請求到數據的回調 * @param fail 接口請求數據失敗的回調 * * @return 返回的對象中有可取消請求的API */ + (HYBURLSessionTask *)getWithUrl:(NSString *)url params:(NSDictionary *)params success:(HYBResponseSuccess)success fail:(HYBResponseFail)fail; // 支持進度 + (HYBURLSessionTask *)getWithUrl:(NSString *)url params:(NSDictionary *)params progress:(HYBGetProgress)progress success:(HYBResponseSuccess)success fail:(HYBResponseFail)fail;
POST接口
對于 POST 請求類型的接口,只有一個,看注釋就可以明白如何使用了。
/*! * @author 黃儀標, 15-11-15 13:11:50 * * POST請求接口,若不指定baseurl,可傳完整的url * * @param url 接口路徑,如/path/getArticleList * @param params 接口中所需的參數,如@{"categoryid" : @(12)} * @param success 接口成功請求到數據的回調 * @param fail 接口請求數據失敗的回調 * * @return 返回的對象中有可取消請求的API */ + (HYBURLSessionTask *)postWithUrl:(NSString *)url params:(NSDictionary *)params success:(HYBResponseSuccess)success fail:(HYBResponseFail)fail; // 支持進度 + (HYBURLSessionTask *)postWithUrl:(NSString *)url params:(NSDictionary *)params progress:(HYBPostProgress)progress success:(HYBResponseSuccess)success fail:(HYBResponseFail)fail;``` ##圖片上傳接口 接口一次只能上傳一張圖片,通常也是這么處理的。這里是以文件流的形式來上傳的哦。其中,`mineType`為`image/jpeg`。
/** * @author 黃儀標, 16-01-31 00:01:40 * * 圖片上傳接口,若不指定baseurl,可傳完整的url * * @param image 圖片對象 * @param url 上傳圖片的接口路徑,如/path/images/ * @param filename 給圖片起一個名字,默認為當前日期時間,格式為 yyyyMMddHHmmss
,后綴為 jpg * @param name 與指定的圖片相關聯的名稱,這是由后端寫接口的人指定的,如imagefiles * @param mimeType 默認為image/jpeg * @param parameters 參數 * @param progress 上傳進度 * @param success 上傳成功回調 * @param fail 上傳失敗回調 * * @return */ + (HYBURLSessionTask *)uploadWithImage:(UIImage *)image url:(NSString *)url filename:(NSString *)filename name:(NSString *)name mimeType:(NSString *)mimeType parameters:(NSDictionary *)parameters progress:(HYBUploadProgress)progress success:(HYBResponseSuccess)success fail:(HYBResponseFail)fail; “`
設置基礎URL
這里還提供了兩個公共接口,一個是用于設置或者更新網絡接口的基礎URL,一個是獲取當前設置使用的網絡接口基礎URL。
/*! * @author 黃儀標, 15-11-15 13:11:45 * * 用于指定網絡請求接口的基礎url,如: * http://henishuo.com或者http://101.200.209.244 * 通常在AppDelegate中啟動時就設置一次就可以了。如果接口有來源 * 于多個服務器,可以調用更新 * * @param baseUrl 網絡接口的基礎url */ + (void)updateBaseUrl:(NSString *)baseUrl; /*! * @author 黃儀標, 15-11-15 13:11:06 * * 對外公開可獲取當前所設置的網絡接口基礎url * * @return 當前基礎url */ + (NSString *)baseUrl;
添加公共請求頭參數
通常每家公司的接口都會設置公共的請求頭參數,以代表是公司的接口。默認已經配置了可接收的類型,但是如果需要額外配置,可通過調用此 api 來添加:
/*! * @author 黃儀標, 15-11-16 13:11:41 * * 配置公共的請求頭,只調用一次即可,通常放在應用啟動的時候配置就可以了 * * @param httpHeaders 只需要將與服務器商定的固定參數設置即可 */ + (void)configCommonHttpHeaders:(NSDictionary *)httpHeaders;
請求與響應格式設置
默認responseType和requestType都是JSON格式。如果不使用JSON,可以全局配置成自己希望的格式即可。若不配置,默認就是JSON。
/*! * @author 黃儀標, 15-12-25 15:12:38 * * 配置返回格式,默認為JSON。若為XML或者PLIST請在全局修改一下 * * @param responseType 響應格式 */ + (void)configResponseType:(HYBResponseType)responseType; /*! * @author 黃儀標, 15-12-25 15:12:45 * * 配置請求格式,默認為JSON。如果要求傳XML或者PLIST,請在全局配置一下 * * @param requestType 請求格式 */ + (void)configRequestType:(HYBRequestType)requestType;
URL編碼問題
考慮到網絡請求接口中,有時候會有中文參數,這時候就會請求失敗,因此我們要對這種類型的 URL 進行編碼,否則請求會失敗。這里是開啟或者關閉自動將 URL 編碼的接口,默認為NO,表示不開啟。
/*! * @author 黃儀標, 15-11-15 14:11:40 * * 開啟或關閉接口打印信息 * * @param isDebug 開發期,最好打開,默認是NO */ + (void)enableInterfaceDebug:(BOOL)isDebug; /*! * @author 黃儀標, 15-11-15 15:11:16 * * 開啟或關閉是否自動將URL使用UTF8編碼,用于處理鏈接中有中文時無法請求的問題 * * @param shouldAutoEncode YES or NO,默認為NO */ + (void)shouldAutoEncodeUrl:(BOOL)shouldAutoEncode;
網絡接口數據日志
對于網絡請求回來的結果,如果沒有一個格式化好的日志打印出來查看,就要通過斷點一步步跟蹤,然后打開出來看,這太麻煩。因此,這里提供了打印日志的私有 API 。默認是不開啟打印日志的。
/*! * @author 黃儀標, 15-11-15 14:11:40 * * 開啟或關閉接口打印信息 * * @param isDebug 開發期,最好打開,默認是NO */ + (void)enableInterfaceDebug:(BOOL)isDebug;
通常在 AppDelegate 中應用啟動的代理方法中調用設置為開啟就可以了。不過是否設置為開啟,當應用以發布證書打包時,都不會打印日志,因為這里做了處理,可放心使用。
// 項目打包上線都不會打印日志,因此可放心。 #ifdef DEBUG #define HYBAppLog(s, ... ) NSLog( @"[%@:in line: %d]-->[message: %@]", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] ) #else #define HYBAppLog(s, ... ) #endif
安裝使用
現在已經支持 cocoapods ,引入以下命令即可:
pod 'HYBNetworking', '~> 2.0.0'
或者直接下載源代碼,拖入工程使用!
源代碼
請大家到我的 github 下載源代碼: https://github.com/CoderJackyHuang/HYBNetworking
溫馨提示
最近老有人問:編譯一直報錯library not found for -lAFNetworking什么問題?
注意:如果您是使用cocoapods來管理第三方庫的,那么直接通過上面安裝使用的方式來安裝即可,然后pod update一下。如果您不是使用cocoapods來引入的,請手動將AFNetworking對應的版本添加到工程。
關注我
Swift/ObjC技術群一: 324400294(已滿)
Swift/ObjC技術群二: 494669518
ObjC/Swift高級群: 461252383(注明年限,新手勿擾)
關注微信公眾號: iOSDevShares
關注新浪微博賬號:標哥Jacky
標哥的GITHUB地址: CoderJackyHuang
支持并捐助
如果您覺得文章對您很有幫忙,希望得到您的支持。您的捐肋將會給予我最大的鼓勵,感謝您的支持!
支付寶捐助 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
![]() |