Vývoj aplikací pro iPhone: Send data to a Web server
Často potřebujeme aby naše aplikace komunikovala s webovým serverem. Budeme tak muset danému serveru posílat data z naší aplikace.
Odeslání lidovolných dat můžeme rozdělit na dvě části – samotné odeslání (příprava dat a jejich poslání) a zpracování odpovědi.
Odeslání požadavku
Pro poslání dat si vytvoříme nový NSMutableURLRequest, ve kterém si inicializujeme adresu, jež se bude volat a na kterou budeme data předávat:
1 |
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://iphone.zaachi.com/"]]; |
Tím máme vytvořenou pouze prázdnou proměnnou, se kterou můžeme dále pracovat.
Nejprve nastavíme metodu pro poslání dat. Můžete si vybrat libovolně například POST:
1 |
[request setHTTPMethod:@"POST"]; |
Requestu můžeme nastavit hlavičky pro poslání:
1 |
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; |
Tím máme request vytvořen a přidáme do něj data, která se budou posílat.
Data musí být typu NSData, takže si nejprve můžeme vytvořit data jako NSString a poté je překonvertovat, pro lepší pochopení:
1 2 3 4 |
NSString *request_body = [NSString stringWithFormat:@"data=%@", [@"variable" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ]; |
V request bude existovat v poli POST proměnná s názvem data, která bude obsahovat řetězec „variable“. Proměnnou request_body překonvertujeme na NSData:
1 |
NSData *request_data = [request_body dataUsingEncoding:NSUTF8StringEncoding]; |
Nakonec data přidáme do requestu:
1 |
[request setHTTPBody:request_data]; |
V úplně posledním kroku vytvoříme connection jako NSURLConnection a předáme jí náš request:
1 |
NSURLConnection *myConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; |
Proměnná myConnection obsahuje výsledek requestu, se kterým můžeme dále pracovat:
1 2 3 4 |
if( !myConnection) //get the response and retain it { NSLog(@"From sendData: data is not sent"); } |
Zpracování odpovědi
Pro zpracování odpovědi serveru využijeme automaticky volaný handler connectionDidFinishLoading, který se volá po dokončení požadavku:
1 2 3 |
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ NSLog(@"From sendData: data was sent"); } |
Zpracování na straně serveru
Na straně serveru zpracujeme data klasicky, například v PHP bude na danou adresu předána proměnná $_POST[‘data’], ve které budou uloženy odesílaná data:
1 2 3 4 |
if( $_POST && array_key_exists('data', $_POST) ) { $out = $_POST['data']; } |
Závěrem
Odeslání požadavku takovýmto způsobem je vcelku jednoduchá věc. Můžete se ještě jednou podívat na celý kód:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ NSLog(@"From sendData: data was sent"); } -(void)sendData{ //create new request NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://iphone.zaachi.com/"]]; //set HTTP Method [request setHTTPMethod:@"POST"]; //set Headers [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; //Implement request_body for send request here username and password set into the body. NSString *request_body = [NSString stringWithFormat:@"data=%@", [@"variable" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ]; //convert nsstring to nsdata NSData *request_data = [request_body dataUsingEncoding:NSUTF8StringEncoding]; //set request body into HTTPBody. [request setHTTPBody:request_data]; //set request url to the NSURLConnection NSURLConnection *myConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; if( !myConnection) //get the response and retain it { NSLog(@"From sendData: data is not sent"); } } |
Ahoj chtěl bych ti poděkovat za článek. Řeším odesílání a přijímání dat přes https. Http mám vyřešené, tam to funguje krásně, ale chtěl bych to aplikovat přes https. Nevím, jak to udělat. Nemáš nějaký fungující projekt, který by to dokázal?
Díky
S pozdravem
Tomáš