>概述
關(guān)于網(wǎng)絡(luò)請(qǐng)求,iOS本身自帶的網(wǎng)絡(luò)請(qǐng)求網(wǎng)上很多洼冻,也不過多的贅述了崭歧,網(wǎng)上的代碼很多,當(dāng)然碘赖,我用的也非常少,剛開始學(xué)習(xí)的時(shí)候是使用了幾次外构,之后就開始使用第三方的框架了普泡,常見的iOS第三方網(wǎng)絡(luò)請(qǐng)求框架有ASIHttpRequest和AFNetworking,兩個(gè)框架都用過审编,可能國內(nèi)大部分經(jīng)典公司都回去使用ASIHttpRequest撼班,但是我還是用AFNetworking比較多,畢竟是mattt的東西垒酬,可以說這是一種盲從吧砰嘁,初來乍到這個(gè)行業(yè)不久,也說不出兩種框架孰強(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的用法口糕,很簡單的使用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)求頭,筆者這邊也沒仔細(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è)還沒有測(cè)試過惧笛,不過再過一點(diǎn)時(shí)間應(yīng)該會(huì)用到,會(huì)補(bǔ)上逞泄。
>我的封裝
我對(duì)網(wǎng)絡(luò)層的封裝稍微講解一下患整,或許和各位熟練掌握網(wǎng)絡(luò)層的大大們比起來是差了些。
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并通過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
的方法到千,可以通過request的method的屬性分派任務(wù)發(fā)送請(qǐng)求昌渤。