http://www.zaachi.com/cs/items/vyvoj-aplikaci-pro-iphone-send-data-to-a-web-server.html

Vývoj aplikací pro iPhone: Send data to a Web server

Publikováno: 23.12.2010 10:30:37

Č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:

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:

[request setHTTPMethod:@"POST"];

Requestu můžeme nastavit hlavičky pro poslání:

[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í:

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:

NSData *request_data = [request_body dataUsingEncoding:NSUTF8StringEncoding];

Nakonec data přidáme do requestu:

[request setHTTPBody:request_data];

V úplně posledním kroku vytvoříme connection jako NSURLConnection a předáme jí náš request:

NSURLConnection *myConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

Proměnná myConnection obsahuje výsledek requestu, se kterým můžeme dále pracovat:

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:

-(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:

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:

-(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");
	}	
}