Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 103

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSString *urlAsString = <# Π—Π΄Π΅ΡΡŒ ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ URL Π²Π΅Π±-сСрвСра #>;


urlAsString = [urlAsString stringByAppendingString:@"?param1=First"];

urlAsString = [urlAsString stringByAppendingString:@"&param2=Second"];


NSURL *url = [NSURL URLWithString: urlAsString];


NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL: url];

[urlRequest setTimeoutInterval:30.0f];

[urlRequest setHTTPMethod:@"DELETE"];


NSString *body = @"bodyParam1=BodyValue1&bodyParam2=BodyValue2";

[urlRequest setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]];


NSOperationQueue *queue = [[NSOperationQueue alloc] init];


[NSURLConnection

sendAsynchronousRequest: urlRequest

queue: queue

completionHandler: ^(NSURLResponse *response,

NSData *data,

NSError *error) {


if ([data length] >0 &&

error == nil){

NSString *html = [[NSString alloc] initWithData: data

encoding: NSUTF8StringEncoding];

NSLog(@"HTML = %@", html);

}

else if ([data length] == 0 &&

error == nil){

NSLog(@"Nothing was downloaded.");

}

else if (error!= nil){

NSLog(@"Error happened = %@", error);

}


}];

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];


self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}


Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Π½ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΊΠΎΠ΄, рассмотрСнный Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… 11.5 ΠΈ 11.6. Π Π°Π·Π½ΠΈΡ†Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ здСсь ΠΌΡ‹ использовали HTTP-ΠΌΠ΅Ρ‚ΠΎΠ΄ DELETE. ΠŸΡ€ΠΎΡ‡Π°Ρ информация практичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° Ρ‚ΠΎΠΉ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»Π° ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π° Π² упомянутых Ρ€Π°Π·Π΄Π΅Π»Π°Ρ….

11.8. ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° запросов HTTP PUT с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ NSURLConnection

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

ВрСбуСтся Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Π΅Π±-слуТбу ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ HTTP PUT, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ рСсурс Π½Π° Π²Π΅Π±-сСрвСрС ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π²Π΅Π±-слуТбС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚Π΅Π»Π΅ HTTP ΠΈΠ»ΠΈ Π² строкС запроса.

РСшСниС

Как ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ GET, POST ΠΈ DELETE, ΠΌΠ΅Ρ‚ΠΎΠ΄ PUT ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ NSURLConnection. НСобходимо явно Π·Π°Π΄Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ вашСго URL ΠΊΠ°ΠΊ PUT.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

НапишСм простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ асинхронноС соСдинСниС ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² строкС запроса, Π° нСсколько β€” Π² Ρ‚Π΅Π»Π΅ HTTP. ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ URL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° PUT:


β€” (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


NSString *urlAsString = <# Π—Π΄Π΅ΡΡŒ ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ URL Π²Π΅Π±-сСрвСра #>;


urlAsString = [urlAsString stringByAppendingString:@"?param1=First"];

urlAsString = [urlAsString stringByAppendingString:@"&param2=Second"];


NSURL *url = [NSURL URLWithString: urlAsString];


NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL: url];

[urlRequest setTimeoutInterval:30.0f];

[urlRequest setHTTPMethod:@"PUT"];


NSString *body = @"bodyParam1=BodyValue1&bodyParam2=BodyValue2";

[urlRequest setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]];


NSOperationQueue *queue = [[NSOperationQueue alloc] init];


[NSURLConnection

sendAsynchronousRequest: urlRequest

queue: queue

completionHandler: ^(NSURLResponse *response,

NSData *data,

NSError *error) {


if ([data length] >0 &&

error == nil){

NSString *html = [[NSString alloc] initWithData: data

encoding: NSUTF8StringEncoding];

NSLog(@"HTML = %@", html);

}

else if ([data length] == 0 &&

error == nil){

NSLog(@"Nothing was downloaded.");

}

else if (error!= nil){

NSLog(@"Error happened = %@", error);

}


}];

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];


self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, пСрСсылаСмый Π² Ρ‚Π΅Π»Π΅ HTTP, Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡ‚ΡŒ Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°ΠΊΠΎΠΌ, Π° пСрСсылаСмый Π² строкС запроса β€” ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

11.9. БСриализация массивов ΠΈ словарСй Π² JSON

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

НСобходимо ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΈΠ»ΠΈ массив Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ JSON, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎ сСти ΠΈΠ»ΠΈ просто ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π½Π° диск.

РСшСниС

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ dataWithJSONObject: options: error: класса NSJSONSerialization.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠœΠ΅Ρ‚ΠΎΠ΄ dataWithJSONObject: options: error: класса NSJSONSerialization ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ словари ΠΈ массивы, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТатся лишь экзСмпляры ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… NSString, NSNumber, NSArray, NSDictionary Π»ΠΈΠ±ΠΎ NSNull для Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Как Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Ρ€Π°Π½Π΅Π΅, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ массивом, Π»ΠΈΠ±ΠΎ словарСм.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим простой массив с нСсколькими ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΈ значСниями:


NSDictionary *dictionary =

@{

@"First Name": @"Anthony",

@"Last Name": @"Robbins",

@"Age": @51,

@"children": @[

@"Anthony's Son 1",

@"Anthony's Daughter 1",

@"Anthony's Son 2",

@"Anthony's Son 3",

@"Anthony's Daughter 2"

],

};


Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² этом словарС содСрТатся имя, фамилия ΠΈ возраст Π­Π½Ρ‚ΠΎΠ½ΠΈ Роббинса. ΠšΠ»ΡŽΡ‡ словаря, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ children, содСрТит ΠΈΠΌΠ΅Π½Π° Π΄Π΅Ρ‚Π΅ΠΉ Π­Π½Ρ‚ΠΎΠ½ΠΈ. Π­Ρ‚ΠΎ массив строк, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкой прСдставлСн ΠΎΠ΄ΠΈΠ½ Ρ€Π΅Π±Π΅Π½ΠΎΠΊ. Π˜Ρ‚Π°ΠΊ, Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ пСрСмСнная dictionary содСрТит всС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π² Π½Π΅Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ JSON:


NSError *error = nil;

NSData *jsonData = [NSJSONSerialization

dataWithJSONObject: dictionary

options: NSJSONWritingPrettyPrinted

error:&error];


if ([jsonData length] > 0 &&

error == nil){


NSLog(@"Successfully serialized the dictionary into data = %@", jsonData);


}

else if ([jsonData length] == 0 &&

error == nil){


NSLog(@"No data was returned after serialization.");


}

else if (error!= nil){


NSLog(@"An error happened = %@", error);


}


Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° dataWithJSONObject: options: error: ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° NSData. ΠŸΡ€Π°Π²Π΄Π°, эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ просто ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² строку ΠΈ вывСсти Π½Π° консоль. Для этого примСняСтся ΠΌΠ΅Ρ‚ΠΎΠ΄-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ initWithData: encoding: класса NSString. Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ прСобразуСтся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ JSON. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прСвращаСтся Π² строку, Π° строка выводится Π² ΠΎΠΊΠ½Π΅ консоли:


β€” (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


NSDictionary *dictionary =

@{

@"First Name": @"Anthony",

@"Last Name": @"Robbins",

@"Age": @51,

@"children": @[

@"Anthony's Son 1",

@"Anthony's Daughter 1",

@"Anthony's Son 2",

@"Anthony's Son 3",

@"Anthony's Daughter 2"

],

};


NSError *error = nil;

NSData *jsonData = [NSJSONSerialization

dataWithJSONObject: dictionary

options: NSJSONWritingPrettyPrinted

error:&error];


if ([jsonData length] > 0 &&

error == nil){


NSLog(@"Successfully serialized the dictionary into data.");

NSString *jsonString = [[NSString alloc] initWithData: jsonData

encoding: NSUTF8StringEncoding];

NSLog(@"JSON String = %@", jsonString);


}

else if ([jsonData length] == 0 &&

error == nil){


NSLog(@"No data was returned after serialization.");


}

else if (error!= nil){


NSLog(@"An error happened = %@", error);

self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

// Π’ΠΎΡ‡ΠΊΠ° пСрСопрСдСлСния для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ настройки послС запуска прилоТСния

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}


Запустив это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² ΠΎΠΊΠ½Π΅ консоли ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:


Successfully serialized the dictionary into data.

JSON String = {

Β«Last NameΒ»: Β«RobbinsΒ»,

Β«First NameΒ»: Β«AnthonyΒ»,

Β«childrenΒ»: [

Β«Anthony's Son 1Β»,

Β«Anthony's Daughter 1Β»,

Β«Anthony's Son 2Β»,

Β«Anthony's Son 3Β»,

Β«Anthony's Daughter 2Β»

],

Β«AgeΒ»: 51

}

11.10. ДСсСриализация Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ JSON Π² массивы ΠΈ словари

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON, ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΈΠ»ΠΈ массив.

РСшСниС

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ JSONObjectWithData: options: error: класса NSJSONSerialization.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Если Π²Ρ‹ ΡƒΠΆΠ΅ сСриализовали ваш ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΈΠ»ΠΈ массив Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ JSON (Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² экзСмплярС NSData, см. Ρ€Π°Π·Π΄Π΅Π» 11.9), Ρ‚ΠΎ эти Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΈΠ»ΠΈ массив. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° JSONObjectWithData: options: error:, относящСгося ΠΊ классу NSJSONSerialization. ΠžΠ±ΡŠΠ΅ΠΊΡ‚, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ этим ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой Π»ΠΈΠ±ΠΎ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Π»ΠΈΠ±ΠΎ массив Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π΅ΠΌΡƒ Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€: