iOS網(wǎng)絡(luò)請(qǐng)求的化糞池

>概述

關(guān)于網(wǎng)絡(luò)請(qǐng)求,iOS本身自帶的網(wǎng)絡(luò)請(qǐng)求網(wǎng)上很多,也不過(guò)多的贅述了,網(wǎng)上的代碼很多,當(dāng)然,我用的也非常少,剛開(kāi)始學(xué)習(xí)的時(shí)候是使用了幾次,之后就開(kāi)始使用第三方的框架了,常見(jiàn)的iOS第三方網(wǎng)絡(luò)請(qǐng)求框架有ASIHttpRequest和AFNetworking,兩個(gè)框架都用過(guò),可能國(guó)內(nèi)大部分經(jīng)典公司都回去使用ASIHttpRequest,但是我還是用AFNetworking比較多,畢竟是mattt的東西,可以說(shuō)這是一種盲從吧,初來(lái)乍到這個(gè)行業(yè)不久,也說(shuō)不出兩種框架孰強(qiáng)孰弱,總之就是用了AFNetworking。

>使用

AFNetworking的官方提供了很多使用方法,那么我們就隨便講一講吧:

AFHTTPRequestOperationManager *manger = [AFHTTPRequestOperationManager manager];
    manger.requestSerializer = [AFHTTPRequestSerializer serializer];
    manger.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manger GET:apiRequest.url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        responseObject = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
        completion(responseObject, nil);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        completion(nil, error);
    }];

這是get的用法,很簡(jiǎn)單的使用AFHTTPRequestOperationManager的對(duì)象的GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure方法,傳入url和parameters的參數(shù),傳入的參數(shù)可以是NSDictionary或者NSArray的對(duì)象都行,AFNetworking會(huì)幫我們變成GET的KeyValue對(duì)的形式。

AFHTTPRequestOperationManager *manger = [AFHTTPRequestOperationManager manager];
    manger.requestSerializer = [AFHTTPRequestSerializer serializer];
    manger.responseSerializer = [AFHTTPResponseSerializer serializer];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:apiRequest.url]];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/x-www-form-urlencoded"
   forHTTPHeaderField:@"Contsetent-Type"];
    [request setHTTPBody:[[apiRequest.parameters toJsonString] dataUsingEncoding:NSUTF8StringEncoding]];
    NSOperation *operation = [manger HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
        responseObject = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
        completion(responseObject, nil);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        completion(nil, error);
    }];
    [manger.operationQueue addOperation:operation];

這是post一個(gè)JSon的方法,當(dāng)然Post一個(gè)JSon的方法還有,官網(wǎng)上提到

[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];

獲取一個(gè)提交JSonBody的請(qǐng)求,但是這個(gè)請(qǐng)求的請(qǐng)求頭是application/json但是平時(shí)這種請(qǐng)求一般都是使用application/x-www-form-urlencoded的請(qǐng)求頭,筆者這邊也沒(méi)仔細(xì)探究,也給讀者些懸念,可以自己研究一下。
Post之外,AFNetworking提供了一些Post方法比如:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

這個(gè)方法是向url的地址post一個(gè)parameter的數(shù)據(jù),但是數(shù)據(jù)的內(nèi)容是以get的parameter的形式,發(fā)送的是[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];的請(qǐng)求,一般發(fā)送的數(shù)據(jù)會(huì)是

POST http://example.com/
Content-Type: application/x-www-form-urlencoded
foo=bar&baz[]=1&baz[]=2&baz[]=3

當(dāng)Body使用foo=bar&baz[]=1&baz[]=2&baz[]=3的時(shí)候是一個(gè)不錯(cuò)的選擇。
當(dāng)我們要上傳文件的時(shí)候,如果服務(wù)器使用的是接收二進(jìn)制的data類型的方法的話,我們只需要在post的body中加入這些data就好了,但是這樣上傳不適合上傳大文件,當(dāng)我們上傳大文件的時(shí)候,我們就要使用Multi-Part Request,官網(wǎng)上提供的是:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileURL:filePath name:@"image" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

這個(gè)還沒(méi)有測(cè)試過(guò),不過(guò)再過(guò)一點(diǎn)時(shí)間應(yīng)該會(huì)用到,會(huì)補(bǔ)上。

>我的封裝

我對(duì)網(wǎng)絡(luò)層的封裝稍微講解一下,或許和各位熟練掌握網(wǎng)絡(luò)層的大大們比起來(lái)是差了些。
WebRequest類
含有屬性:

@property (nonatomic, strong) NSString *url;
@property (nonatomic, strong) NSDictionary *parameters;
@property (nonatomic, assign) ApiRequestMethod method;
@property (nonatomic, strong) UIImage *image;

工廠方法

+ (instancetype)requestForTestServer {
    WebRequest *request = [self defaultRequest];
    request.url = @"http://server:8888/api";
    request.parameters = @{@"id":@"books" };
    return  request;
}

WebResponse類
屬性:(主要按照服務(wù)器返回的數(shù)據(jù))

@property (nonatomic, assign) CGFloat version;
@property (nonatomic, strong) NSString *encoding;
@property (nonatomic, strong) NSArray *entities;
@property (nonatomic, strong) NSNumber *errorCode;
@property (nonatomic, strong) NSString *errorMsg;
@property (nonatomic, strong) NSDictionary *entity;

工廠方法:

+ (instancetype)getResponseWithDictionary:(NSDictionary *)dictionary error:(NSError *)error;
+ (instancetype)postResponseWithDictionary:(NSDictionary *)dictionary error:(NSError *)error;

分別為response的屬性賦值

WebService類
主要負(fù)責(zé)發(fā)送request,并接收response并通過(guò)delegate的方式將分裝好的response傳出去。
這個(gè)類中就是對(duì)AFNetworking的分裝。
分裝了
類似于
- (void)sendPostRequest:(WebRequest *)request withCompletion:(void (^)(id data, NSError *error))completion
- (void)sendGetRequest:(WebRequest *)request withCompletion:(void (^)(id data, NSError *error))completion
的方法,可以通過(guò)request的method的屬性分派任務(wù)發(fā)送請(qǐng)求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容