Отправка POST запроса (NSURLConnection, iOS, Xcode 4.2)

Уроки по созданию приложений для iOS (iPhone, iPad, iPod Touch) в Xcode (Objective-C)
Ответить
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Отправка POST запроса (NSURLConnection, iOS, Xcode 4.2)

Сообщение Александр »

Отправка POST запроса (NSURLConnection, iOS, Xcode 4.2)
Objective-C 2.0, iPhone, iPod, iPad, iOS

Отправка POST запроса схожа с отправкой GET запроса. Если вы хотите более подробно узнать о том как работать с NSURLConnection прочтите Отправка GET запроса (NSURLConnection, iOS, Xcode 4.2).

Код отправки POST запроса

Код: Выделить всё

    // создаем запрос    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://flapps.ru/example/user-info.php"]                                    cachePolicy:NSURLRequestUseProtocolCachePolicy                                    timeoutInterval:15.0];    request.HTTPMethod = @"POST";    // указываем параметры POST запроса    NSString* params = @"param1=2&param2=2";    request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];

В этом коде мы устанавливаем метод POST. По умолчанию HTTP методом HTTPMethod является метод GET.
Задать HTTPMethod можно и так

Код: Выделить всё

[request setHTTPMethod: @"POST"];
это делает одно и то же, только обращение к HTTPBody происходит по разному.
request.HTTPMethod - указывает параметр через свойство, а setHTTPMethod - через отправку сообщения.
Более подробно про NSMutableURLRequest можно почитать в официальной документации https://developer.apple.com/library/mac ... rence.html

Других отличий от кода из статьи Отправка GET запроса (NSURLConnection, iOS, Xcode 4.2) в этом приложении не будет.



Весь код

Код: Выделить всё

- (void)viewDidLoad{    [super viewDidLoad];        // создаем запрос    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://flapps.ru/example/user-info.php"]                                    cachePolicy:NSURLRequestUseProtocolCachePolicy                                    timeoutInterval:15.0];    request.HTTPMethod = @"POST";    // указываем параметры POST запроса    NSString* params = @"param1=2&param2=2";    request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];            // создаём соединение и начинаем загрузку    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];     if (connection) {        // соединение началось        label.text = @"Connecting...";        // создаем NSMutableData, чтобы сохранить полученные данные        receivedData = [[NSMutableData data] retain];    } else {        // при попытке соединиться произошла ошибка        label.text = @"Connection error!";    }                             } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{    // получен ответ от сервера    [receivedData setLength:0];} - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{    // добавляем новые данные к receivedData    [receivedData appendData:data];} - (void)connection:(NSURLConnection *)connection  didFailWithError:(NSError *)error {    // освобождаем соединение и полученные данные    [connection release];    [receivedData release];        // выводим сообщение об ошибке    NSString *errorString = [[NSString alloc] initWithFormat:@"Connection failed! Error - %@ %@ %@",                             [error localizedDescription],                             [error description],                             [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]];    label.text = errorString;        [errorString release];}  - (void)connectionDidFinishLoading:(NSURLConnection *)connection {    // данные получены    // здесь можно произвести операции с данными        // можно узнать размер загруженных данных    //NSString *dataString = [[NSString alloc] initWithFormat:@"Received %d bytes of data",[receivedData length]];        // если ожидаемые полученные данные - это строка, то можно вывести её    NSString *dataString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];        label.text = dataString;        // освобождаем соединение и полученные данные    [connection release];    [receivedData release];    [dataString release];}

При запуске приложения, как и при использовании метода GET, я увидел это:

Код: Выделить всё

HTTP_USER_AGENT: MethodPOST/1.0 CFNetwork/485.13.9 Darwin/11.0.0<br />
raeen
Сообщения: 4
Зарегистрирован: 05 май 2012, 00:17

Re: Отправка POST запроса (NSURLConnection, iOS, Xcode 4.2)

Сообщение raeen »

Подскажите, а как после получения данных с первого запроса, вставить их во второй запрос и снова его отправить?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Отправка POST запроса (NSURLConnection, iOS, Xcode 4.2)

Сообщение Александр »

raeen

Код: Выделить всё

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {    // данные получены    // здесь можно произвести операции с данными
После получения одних данных, можно совершить второй запрос. Снова вызвать requestWithURL.
raeen
Сообщения: 4
Зарегистрирован: 05 май 2012, 00:17

Re: Отправка POST запроса (NSURLConnection, iOS, Xcode 4.2)

Сообщение raeen »

Александр писал(а):raeen

Код: Выделить всё

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {    // данные получены    // здесь можно произвести операции с данными
После получения одних данных, можно совершить второй запрос. Снова вызвать requestWithURL.
А где именно осуществлять вызов requestWithURL? В каком фрагменте кода?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Отправка POST запроса (NSURLConnection, iOS, Xcode 4.2)

Сообщение Александр »

raeen
На строчке с комментарием

Код: Выделить всё

// здесь можно произвести операции с данными
Логично же, что нужно выполнить новый запрос. Точно так же как и первый, только с другим адресом/параметрами.
С новым запросом так же будут didReceiveResponse, didReceiveData, didFailWithError, connectionDidFinishLoading.
Я такую задачу не решал, с objective-c сейчас не работаю, конкретно ничего не посоветую.
Может быть будет достаточно выполнить новый запрос по окончанию предыдущего и тогда didReceiveResponse и т.п. будут те же самые и можно будет так и оставить, а может быть стоит вынести что-то в отдельный класс, чтобы не говнокодить.
Ответить