iOS開發之網絡請求(基于AFNetworking的再封裝)

jopen 8年前發布 | 93K 次閱讀 iOS開發 移動開發 AFNetworking

最近一直很忙也沒有什么時間寫博客了。放假了休息一下,就寫一篇博客來總結一下最近做項目中出現過的問題吧!!!

首先,在項目中我的起到了什么作用,無非就是把美工(UI設計師)給我們的圖顯示出來,然后再和服務器進行交互。

那個我們和服務器怎么交互呢?最簡單的方式就是說話唄,但是我們要跟服務器說話必須通過我們彼此能聽的懂的話來交流,也就需要制定很多的協議了(http,tcp,udp等,這個有興趣的朋友可以了解一下網絡協議的東西)。但是我平常最常使用的還是http協議。

http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html 這篇博客詳細講解了http協議的東西(我能說是我隨便百度了一篇博客嗎?)

然后github上的AFNetworking應該現在是應用的最廣泛的網絡請求三方庫了吧。那么今天就來說一下AFNetworing。

既然人家已經封裝的這么好了,我們為什么還要多此一舉再封裝呢?

那現在就來說一下再封裝的意義是什么?

最重要的意義差不多就是統一接口(這個也是封裝的一個作用,如果不了解封裝的同學可以去看看封裝的用處,是個提高效率的非常有效的辦法),這一點要是再多人項目中尤其能體現出來,我的一個同事用的是系統自帶的MKNetworking,很多人可能聽都沒聽過,他雖然用的很好,我也能看的懂,但是還是感覺看起來很難受,因為我根本不想看到他的具體用法和實現是什么樣子的(雖然真正敲起來可能也只是多了兩行代碼而已),只需要調一個接口就什么都用了不就好了,為什么還要敲那么多重復的代碼呢(Don't repeat yourself)?

好,下面我就來對AFNetworking再封裝:

首先,還是說一下封裝的事情,如果是你自己用,那么你可以隨便寫一寫,因為你不用注釋也能看的懂。但是如果是給幾個人用,你可以直接告訴他們,或者說是寫一個比較詳細的注釋,以便他們日后忘記了看一下就知道每個參數的意義是什么了!!!

那么我在網絡請求的時候究竟最常用的網絡請求有哪些呢?

我最常用到的就是get,post和upload了。(這幾中請求方式也可以去了解一下他們的區別)

說了這么多的廢話了來點干貨。

@interface UploadParam : NSObject
/**
 *  圖片的二進制數據
 */
@property (nonatomic, strong) NSData *data;
/**
 *  服務器對應的參數名稱
 */
@property (nonatomic, copy) NSString *name;
/**
 *  文件的名稱(上傳到服務器后,服務器保存的文件名)
 */
@property (nonatomic, copy) NSString *filename;
/**
 *  文件的MIME類型(image/png,image/jpg等)
 */
@property (nonatomic, copy) NSString *mimeType;
@end
@class UploadParam;

/**
 *  網絡請求類型
 */
typedef NS_ENUM(NSUInteger,HttpRequestType) {
    /**
     *  get請求
     */
    HttpRequestTypeGet = 0,
    /**
     *  post請求
     */
    HttpRequestTypePost
};

@interface HttpRequest : NSObject

/**
 *  發送get請求
 *
 *  @param URLString  請求的網址字符串
 *  @param parameters 請求的參數
 *  @param success    請求成功的回調
 *  @param failure    請求失敗的回調
 */
+ (void)getWithURLString:(NSString *)URLString
              parameters:(id)parameters
                 success:(void (^)(id responseObject))success
                 failure:(void (^)(NSError *error))failure;

/**
 *  發送post請求
 *
 *  @param URLString  請求的網址字符串
 *  @param parameters 請求的參數
 *  @param success    請求成功的回調
 *  @param failure    請求失敗的回調
 */
+ (void)postWithURLString:(NSString *)URLString
               parameters:(id)parameters
                  success:(void (^)(id responseObject))success
                  failure:(void (^)(NSError *error))failure;

/**
 *  發送網絡請求
 *
 *  @param URLString   請求的網址字符串
 *  @param parameters  請求的參數
 *  @param type        請求的類型
 *  @param resultBlock 請求的結果
 */
+ (void)requestWithURLString:(NSString *)URLString
                  parameters:(id)parameters
                        type:(HttpRequestType)type
                     success:(void (^)(id responseObject))success
                     failure:(void (^)(NSError *error))failure;

/**
 *  上傳圖片
 *
 *  @param URLString   上傳圖片的網址字符串
 *  @param parameters  上傳圖片的參數
 *  @param uploadParam 上傳圖片的信息
 *  @param success     上傳成功的回調
 *  @param failure     上傳失敗的回調
 */
+ (void)uploadWithURLString:(NSString *)URLString
                 parameters:(id)parameters
                uploadParam:(UploadParam *)uploadParam
                    success:(void (^)())success
                    failure:(void (^)(NSError *error))failure;
#import "HttpRequest.h"
#import "AFNetworking.h"
#import "UploadParam.h"

@implementation HttpRequest

#pragma mark -- GET請求 --
+ (void)getWithURLString:(NSString *)URLString
              parameters:(id)parameters
                 success:(void (^)(id))success
                 failure:(void (^)(NSError *))failure {

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    /**
     *  可以接受的類型
     */
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    /**
     *  請求隊列的最大并發數
     */
//    manager.operationQueue.maxConcurrentOperationCount = 5;
    /**
     *  請求超時的時間
     */
//    manager.requestSerializer.timeoutInterval = 5;
    [manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);
        }
    }];
}

#pragma mark -- POST請求 --
+ (void)postWithURLString:(NSString *)URLString
               parameters:(id)parameters
                  success:(void (^)(id))success
                  failure:(void (^)(NSError *))failure {

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);
        }
    }];
}

#pragma mark -- POST/GET網絡請求 --
+ (void)requestWithURLString:(NSString *)URLString
                  parameters:(id)parameters
                        type:(HttpRequestType)type
                     success:(void (^)(id))success
                     failure:(void (^)(NSError *))failure {

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    switch (type) {
        case HttpRequestTypeGet:
        {
            [manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                if (success) {
                    success(responseObject);
                }
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                if (failure) {
                    failure(error);
                }
            }];
        }
            break;
        case HttpRequestTypePost:
        {
            [manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                if (success) {
                    success(responseObject);
                }
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                if (failure) {
                    failure(error);
                }
            }];
        }
            break;
    }
}

#pragma mark -- 上傳圖片 --
+ (void)uploadWithURLString:(NSString *)URLString
                 parameters:(id)parameters
                uploadParam:(UploadParam *)uploadParam
                    success:(void (^)())success
                    failure:(void (^)(NSError *))failure {

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        [formData appendPartWithFileData:uploadParam.data name:uploadParam.name fileName:uploadParam.filename mimeType:uploadParam.mimeType];
    } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);
        }
    }];
}

我把我的demo也傳到我的空間,歡迎大家下載。我用的是cocospod三方庫,如果下載了不能使用的,也可以聯系我!

來自: http://www.cnblogs.com/wuhongxing/p/5094634.html

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