基于AFNetworking3.0網絡封裝

jack_zhang 8年前發布 | 15K 次閱讀 iOS開發 移動開發 AFNetworking

來自: 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

支持并捐助

如果您覺得文章對您很有幫忙,希望得到您的支持。您的捐肋將會給予我最大的鼓勵,感謝您的支持!

<th>微信捐助</th>

</tr>

</thead>

<td> <img src="https://simg.open-open.com/show/3bef3b99597282da299c6e97fa777537.jpg" class="alignCenter" width="320" height="442" /> </td>

</tr>

</tbody>

</table> </div>

 本文由用戶 jack_zhang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
支付寶捐助
  • sesese色