>概述
關(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)求。