Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

Rambler.iOS #8: Как не стать жертвой бэкендеров

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Как не стать жертвой
бекендеров
Ирина Дягилева
RAMBLER&Co

YouTube-Videos werden auf SlideShare nicht mehr unterstützt.

Original auf YouTube ansehen

Нужна ли валидация ответа сервера?
2
Nächste SlideShare
I tmozg js_school
I tmozg js_school
Wird geladen in …3
×

Hier ansehen

1 von 43 Anzeige

Rambler.iOS #8: Как не стать жертвой бэкендеров

Herunterladen, um offline zu lesen

Клиент-серверное взаимодействие лежит в основе большинства мобильных приложений. Язык общения между клиентом и сервером всегда закреплён определённым контрактом. Однако валидация этого контракта незаслуженно остаётся в стороне. Отсюда и большинство проблем на клиенте — некорректное отображение, неконсистентность данных и падения.

Как избежать этих проблем и повысить уровень crash-free ваших приложений, добавив предварительную валидацию, расскажет Ирина Дягилева.

Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.

Клиент-серверное взаимодействие лежит в основе большинства мобильных приложений. Язык общения между клиентом и сервером всегда закреплён определённым контрактом. Однако валидация этого контракта незаслуженно остаётся в стороне. Отсюда и большинство проблем на клиенте — некорректное отображение, неконсистентность данных и падения.

Как избежать этих проблем и повысить уровень crash-free ваших приложений, добавив предварительную валидацию, расскажет Ирина Дягилева.

Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.

Anzeige
Anzeige

Weitere Verwandte Inhalte

Diashows für Sie (20)

Andere mochten auch (17)

Anzeige

Ähnlich wie Rambler.iOS #8: Как не стать жертвой бэкендеров (20)

Weitere von RAMBLER&Co (15)

Anzeige

Aktuellste (20)

Rambler.iOS #8: Как не стать жертвой бэкендеров

  1. 1. Как не стать жертвой бекендеров Ирина Дягилева RAMBLER&Co
  2. 2. Нужна ли валидация ответа сервера? 2
  3. 3. 3
  4. 4. Crash-free 4
  5. 5. 5
  6. 6. Нужен контракт между клиентом и сервером и его валидация 6
  7. 7. План • Валидация ответа сервера • JSON-схема • Библиотеки • Время валидации • Полезные инструменты 7
  8. 8. LiveJournal @implementation RegistrationResponseValidator - (NSError *)validateServerResponse:(id)response { NSError *resultError = nil; return resultError; } @end if (![super validateResponseIsErrorClass:response error:&resultError]) { return resultError; } if(![super validateResponseIsDictionaryClass:response error:&resultError]) { return resultError; } if (response[@"access_token"] == nil || response[@"displayName"] == nil || response[@"id"] == nil) { resultError = ...; // создание ошибки валидации } 8
  9. 9. Афиша - (NSError *)validateResponseObject:(id)responseObject mapping:(EKManagedObjectMapping *)mapping { return nil; } NSError *validationError = [self validateResponseObject:responseObject]; if (validationError) { return [self validationError]; } NSArray *primaryKeys = mapping.rca_primaryKeys; if (primaryKeys) { for (NSString *primaryKey in primaryKeys) { EKPropertyMapping *propertyMapping = [self propertyMappingForPrimaryKey:primaryKey mapping:mapping]; if (!responseObject[propertyMapping.keyPath]) { return [self validationError]; } } } 9
  10. 10. JSON Schema http://json-schema.org/ это JSON набор инструкций для описания структуры JSON документов 10
  11. 11. Типы объектов JSON JSON Schema string string number number/integer object object array array true true false false null null 11
  12. 12. Примеры json-схем { "type": "boolean" } true 12 false "true" 30
  13. 13. Строковые типы { "type": "string", "minLength": 7, "maxLength": 9 } 13 "12345678" "#FF0000" "12345" true
  14. 14. { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" } Строковые типы 14 "#FFFFFf22" "#3C2FCB" "FFFFFf22" "#3C2FCB00" 14
  15. 15. Строковые типы { "type": "string", "format": "email" } "email", "date-time", "hostname", "ipv4", "ipv6", "uri" 15 "i.dyagileva@rambler-co.ru" "i.dyagileva"
  16. 16. Числовые типы { "type": "integer", "minimum": 200, "maximum": 500, "exclusiveMinimum": true, "multipleOf": 5 } 16 205 500 200 104
  17. 17. Перечисления { "type": "string", "enum": [ "red", "green", "blue" ] } 17 "red" "blue" "pink" "#FFFFFF"
  18. 18. Массивы { "type": "array", "items": { "type": ["string", "integer"] }, "minItems": 2, "maxItems": 3, "uniqueItems": true } 18 ["a", 2] [4, 5, 6] [1, 2, 1] ["a", "b", "c", "d"]
  19. 19. Объекты { "type": "object", "properties": { "articleID": { "type": "string" }, "title": { "type": "string" }, "subtitle": { "type": "string" } }, "required": ["articleID","title"], } { "articleID": "1", "title": "Заголовок", "subtitle": "Подзаголовок" } { "articleID": "1", "subtitle": "Подзаголовок" } 19
  20. 20. Объекты { "type": "object", "properties": { "articleID": { "type": "string" }, "title": { "type": "string" }, "subtitle": { "type": "string" } }, "required": ["articleID","title"], "additionalProperties": false } { "articleID": "1", "title": "Заголовок", "subtitle": "Подзаголовок" } { "articleID": "1", "title": "Заголовок", "subtitle": "Подзаголовок", "description": "Описание" } 20
  21. 21. Определения { "type": "object", "properties": { "backgroundColor": { "$ref": "#/definitions/color" }, "foregroundColor": { "$ref": "#/definitions/color" } }, "definitions": { "color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" } } } 21 { "backgroundColor": "#FFFFFF", "foregroundColor": "#FF0000" } { "backgroundColor": "FFFFFF", "foregroundColor": "#FF" }
  22. 22. Композиция { "type": "array", "items": { "allOf": [ { "type": "integer", "minimum": 0 }, { "type": "integer", "multipleOf": 5 } ] } } 22 [5, 15] [-4, 5] [0, 0] [1, 8]
  23. 23. Композиция { "type": "array", "items": { "anyOf": [ { "type": "integer", "minimum": 0 }, { "type": "integer", "multipleOf": 5 } ] } } 23 [-5, 5] [-4, 5] [1, 8] [1, "8"]
  24. 24. Композиция { "type": "array", "items": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "integer", "multipleOf": 5 } ] } } 24 [1, 8] [0, 0] [1, -5] [1, -4]
  25. 25. Композиция { "type": "object", "properties": { "likeValue": { "type": "boolean" }, "place": { "type": "string" }, "event": { "type": "string" } }, "required": ["likeValue"] , "oneOf": [ { "required": ["place"] }, { "required": ["event"] } ] } 25 { "likeValue": true, "event": "event", } { "likeValue": true, "event": "event", "place": "place" } { "likeValue": true }
  26. 26. Отрицание { "type": "array", "items": { "not": { "anyOf": [ { "type": "integer", "minimum": 0 }, { "type": "integer", "multipleOf": 5 } ] } } } 26 [-1, -4] [-1, -5] [-8, -8] [1, -4]
  27. 27. Объявление схемы { "$schema": "http://json-schema.org/draft-04/schema#", } 27 "id": "http://domain.com/schemas/myschema.json"
  28. 28. { } "$schema": "http://json-schema.org/draft-04/schema#", Объявление схемы 28 "id": "http://domain.com/schemas/myschema.json"
  29. 29. Валидатор 29
  30. 30. /** Протокол валидатора ответа сервера */ @protocol ROSResponseValidator <NSObject> - (BOOL)validateResponse:(id)response withSchema:(NSDictionary *)schema error:(NSError **)error; @end 30
  31. 31. /** Протокол поставщика json-схем */ @protocol ROSJSONSchemaProvider <NSObject> - (NSDictionary *)sectionsSchema; - (NSDictionary *)articleSchema; @end 31
  32. 32. Библиотеки ObjC • KiteJSONValidator 39 • JSONTools 41 • JSONSchemaValidation 14 32
  33. 33. Библиотеки Swift • JSONSchema 96 33
  34. 34. Время валидации 34 3 % 12 % 8 % 77 % Скачивание Валидация Маппинг Понсомизация Запрос списка секций ОПЕРАЦИЯ ВРЕМЯ (С) Скачивание 0,2012 Валидация 0,0215 Маппинг 0,0323 Понсомизация 0,0069
  35. 35. Время валидации 35 4 % 11 % 30 % 55 % Скачивание Валидация Маппинг Понсомизация Запрос тела статьи ОПЕРАЦИЯ ВРЕМЯ (С) Скачивание 0,1040 Валидация 0,0560 Маппинг 0,0217 Понсомизация 0,0071
  36. 36. Полезные ссылки и инструменты
  37. 37. Документация http://json-schema.org/ 37
  38. 38. Онлайн-валидатор http://www.jsonschemavalidator.net 38
  39. 39. Онлайн-генератор http://jsonschema.net/ 39
  40. 40. Генератор JSON-моков http://json-schema-faker.js.org 40
  41. 41. Итоги • Предотвращение ошибок и падений приложения • Документирование структур данных, стандартизация • Помощь при тестировании • Генерация моков 41
  42. 42. Контакты ivdyagileva@gmail.com ivdyagileva https://www.linkedin.com/in/dyagileva https://github.com/idva

×