Weitere ähnliche Inhalte Ähnlich wie Rambler.iOS #8: Как не стать жертвой бэкендеров (20) Rambler.iOS #8: Как не стать жертвой бэкендеров1. Как не стать жертвой
бекендеров
Ирина Дягилева
RAMBLER&Co
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. Афиша
- (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
11. Типы объектов
JSON JSON Schema
string string
number number/integer
object object
array array
true true
false false
null null
11
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. Объекты
{
"type": "object",
"properties": {
"articleID": {
"type": "string"
},
"title": {
"type": "string"
},
"subtitle": {
"type": "string"
}
},
"required": ["articleID","title"],
}
{
"articleID": "1",
"title": "Заголовок",
"subtitle": "Подзаголовок"
}
{
"articleID": "1",
"subtitle": "Подзаголовок"
}
19
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. Определения
{
"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"
}
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
}
30. /**
Протокол валидатора ответа сервера
*/
@protocol ROSResponseValidator <NSObject>
- (BOOL)validateResponse:(id)response
withSchema:(NSDictionary *)schema
error:(NSError **)error;
@end
30
41. Итоги
• Предотвращение ошибок и падений приложения
• Документирование структур данных,
стандартизация
• Помощь при тестировании
• Генерация моков
41