Чаще всего данные из сети мы получаем в NSData через класс NSURLConnection. Чтобы часто не повторять код, предлагаю интересное расширение NSData, которое наделяет NSData статическими методами для получения данных из сети. Причем, есть возможность выбора метода (GET или POST) и передачи параметров:


@interface NSData ( NSDataAdditions )
+(NSData *) dataWithStringURL:(NSString*)url error:(NSError**)error;
+(NSData *) dataWithURL:(NSURL*)url error:(NSError**)error;
+(NSData *) dataWithStringURL:(NSString*)url method:(NSString*)method params:(NSDictionary*)params error:(NSError**)error;
+(NSData *) dataWithURL:(NSURL*)url method:(NSString*)method params:(NSDictionary*)params error:(NSError**)error;
@end

Исходный код вы найдете ниже. Рассмотрим каждый метод.

+(NSData *) dataWithStringURL:(NSString*)url error:(NSError**)error;

Загружает данные по адресу url, который передается в виде строки NSString. Можно получить ошибку, если она произошла.

+(NSData *) dataWithURL:(NSURL*)url error:(NSError**)error;

Метод аналогичный тому, что выше. Только в качестве адреса используется NSURL.

+(NSData *) dataWithStringURL:(NSString*)url method:(NSString*)method params:(NSDictionary*)params error:(NSError**)error;

Загружает данные, которые находятся по адресу url (представлено строкой NSString). Можно выбрать метод (GET или POST) через параметр method. Можно передать параметры через словать params и получить ошибку, если она была.

+(NSData *) dataWithURL:(NSURL*)url method:(NSString*)method params:(NSDictionary*)params error:(NSError**)error;

Метод аналогичный тому, что выше. Только в качестве адреса используется NSURL.

Использовать можно так:

NSString* stringURL = @"http://www.server.com/request";

NSError* error = nil;
NSDictionary* params = [NSDictionary dictionaryWithObjectsAndKeys:@"value", @"param", nil];

NSData* data = [NSData dataWithStringURL:stringURL method:@"POST" params:params error:&error];

В data будут находится загруженные данные. Замечу, что все методы синхронные т.е. блокируют поток на время загрузки.

Исходный код (для использования подключайте NSDataAdditions.h):

Поместите в NSDataAdditions.h


#import <Foundation/Foundation.h>
@interface NSData ( NSDataAdditions )
+(NSData *) dataWithStringURL:(NSString*)url error:(NSError**)error;
+(NSData *) dataWithURL:(NSURL*)url error:(NSError**)error;
+(NSData *) dataWithStringURL:(NSString*)url method:(NSString*)method params:(NSDictionary*)params error:(NSError**)error;
+(NSData *) dataWithURL:(NSURL*)url method:(NSString*)method params:(NSDictionary*)params error:(NSError**)error;
@end

Поместите в NSDataAdditions.m


#import "NSDataAdditions.h"

@implementation NSData ( NSDataAdditions )
+(NSData *) dataWithStringURL:(NSString*)url error:(NSError**)error {
return [self dataWithURL:[NSURL URLWithString:url] error:error];
}
+(NSData *) dataWithURL:(NSURL*)url error:(NSError**)error {
return [self dataWithURL:url method:@"GET" params:nil error:error];
}
+(NSData *) dataWithStringURL:(NSString*)url method:(NSString*)method params:(NSDictionary*)params error:(NSError**)error {
return [self dataWithURL:[NSURL URLWithString:url] method:method params:params error:error];
}
+(NSData *) dataWithURL:(NSURL*)url method:(NSString*)method params:(NSDictionary*)params error:(NSError**)error {
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:30.0f];
request.HTTPMethod = method;


if ( params != nil ) {
NSMutableString* httpBody = [NSMutableString new];

for( NSString* key in params )
[httpBody appendFormat:@"%@=%@&",key,[params objectForKey:key]];

if ( [method isEqualToString:@"POST"] )
request.HTTPBody = [httpBody dataUsingEncoding:NSUTF8StringEncoding];
else {
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?%@",url.absoluteString, httpBody]]];
}

[httpBody release];
}


NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:error];

[request release];

return data;
}
@end

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *