SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
Клиент-серверный API глазами
iOS разработчика
Игорь Кашкута
Кратко о себе
2010 2011 2015! "!
Client BackendAPI
Client BackendAPI
“ СОЗДАНИЕ И
ПОДДЕРЖКА
API — ОБЩЕЕ
ДЕЛО
6План
Что может пойти не так с HTTP
Что в таком случае делать
Что делать в любом случае
Как бывает
HTTP
8HTTP
Стандарт
Повсеместно распространен
Библиотек, примеров, статей — множество
9“Магазин”. День 0
Выбрали HTTP, почему нет
GET запрос на список товаров, json в ответ
GET запрос на детальное описание товара, json в ответ
Остальное по аналогии
Выпустили на iOS и Android
10День 1
А давай добавим немного HTML в описание товара?
Ну совсем чуть-чуть
Да на самом деле хватит одного <b>
11День 1. Мысли
Нужна обратная совместимость для клиентов на бою
Добавить параметр в запрос?
Сделать новую версию api?
Отдавать в ответе всё — и старое и c <b>?
А что если в дальше понадобится <i>?
12День 2
А давай сделаем чат? Пользователи будут в восторге!
Причём давай наш собственный, с уникальными фичами
13День 2. Мысли
HTTP — однонаправленный. Клиент спросил — сервер ответил
А тут надо в обе стороны… хм…
Ок, быть может long polling сойдёт…
14День 3
А давай раскатим чат только на часть аудитории?
И сделаем A/B-тест!
15День 3. Мысли
Ок, добавим запрос на конфигурацию фичи
В ответе также будет вариант A/B теста
16День 4
А давай добавим ссылки в сообщения в чате?
И чтобы они вели на другие экраны приложения
И не забудь, теперь мы всегда выкатываем постепенно!
17HTTP
С развитием продукта просто HTTP не хватает
Хочется чтобы API был про продукт, а не про стандарт
Нужна идеология, план расширения
Свой протокол
Когда понятно, что не HTTP единым
Свой протокол
Заточен под продукт
Больше возможностей
Меньше неопределённостей
Удобнее, потому что самим для себя
Но имеет свою цену
19
Badoo — MAPI
Выкатили в 2010
Постоянно вносим изменения
Поддерживаем пять платформ
Прошли несколько мажорных редизайнов продукта
Ни разу не хотели всё переделать
20
Protobuf
Типизированный формат описания данных
Есть примитивные типы, перечисления и структуры
Все поля структур опциональны
Поля структур могут быть массивами
21
Protobuf
Набор генераторов кода для всех основных ЯП
Превращает спеку в модель на выбранном языке
Предоставляет де/сериализацию в бинарь и JSON
22
Базовое сообщение
Атом коммуникации
От клиента к серверу и наоборот
23
message Message {
uint32 message_id = 1;
uint32 connection_id = 2;
repeated MessageBody bodies = 3;
}
24
struct Message {
var messageId: UInt32?
var connectionId: UInt32?
var bodies: [MessageBody]?
}
25
MessageBody
Состоит из типа и тела
Все типы — значения перечисления
Все тела — поля одной структуры. Это дёшево!
Строгое соответствие тип → тело
У сообщения тела может не быть
26
struct MessageBody {
var type: MessageType?
var serverAppStartup: ServerAppStartup?
var clientAppStartup: ClientAppStartup?
var genericError: GenericError?
[…]
}
27
enum MessageType {
case acknowledge // body: null
case serverAppStartup // body: serverAppStartup
case clientAppStartup // body: clientAppStartup
case genericError // body: genericError
[…]
}
28
struct MessageBody {
var type: MessageType? // = .serverAppStartup
var serverAppStartup: ServerAppStartup?
var clientAppStartup: ClientAppStartup?
var genericError: GenericError?
[…]
}
29
struct MessageBody {
var type: MessageType? // = .clientAppStartup
var serverAppStartup: ServerAppStartup?
var clientAppStartup: ClientAppStartup?
var genericError: GenericError?
[…]
}
30
struct MessageBody {
var type: MessageType? // = .genericError
var serverAppStartup: ServerAppStartup?
var clientAppStartup: ClientAppStartup?
var genericError: GenericError?
[…]
}
31
MessageType
Каждому сообщению соответствует набор ответов
Ответ не нужен — тогда Acknowledge без тела
32
enum MessageType {
// response: clientAppStartup
// response: genericError
case serverAppStartup
[…]
}
33
Handshake 34
Client Server
.serverAppStartup
.clientAppStartup
struct ServerAppStartup {
var appVersion: String?
var platformType: PlatformType?
var deviceInfo: DeviceInfo?
var sessionId: String?
var capabilities: [CapabilityType]?
var features: [FeatureType]?
}
35
enum CapabilityType {
case supportsBoldTagInDescriptions
case supportsItalicTagInDescriptions
[…]
}
enum FeatureType {
case chat
case nativeLinksInChat
[…]
}
36
struct ClientAppStartup {
var features: [AppFeature]?
[…]
}
struct AppFeature {
var type: FeatureType?
var isEnabled: Bool?
var abTestVariationId: String?
}
37
Транспортировка сообщений
В HTTP каждый запрос независим от предыдущих
В данном подходе предполагается обратное
Бинарный формат Protobuf!
38
HTTP/1.0 API 39
Client Server
TCP
HTTP json
bytes
TCP
HTTP
TCP
HTTP/1.1 API 40
Client Server
TCP
HTTP json
bytes
HTTP
HTTP
HTTP
Badoo MAPI 41
Client Server
TCP
CUSTOM binary protobuf
bytes
2017 — WebSocket! 42
Client Server
TCP
WebSocket binary protobuf
bytes
Подвох
Чтение траффика сложнее — это не Charles
Нет открытых библиотек а-ля Alamofire
Вряд ли подойдёт для публичных API
43
Полезные советы
Общие рекомендации
Подробная документация — тоже API
Описание
Скриншоты
Примеры запросов/ответов с данными
Все граничные случаи
45
Согласованность
Весь набор документов — цельный продукт
Изменения — атомарны
Единый источник правды
46
Изменения
Только с одобрения всех действующих сторон
В едином техническом стиле
47
API — в репозиторий
Атомарные изменения нескольких документов
Каждому изменению — тикет с причиной
Привычный процесс ревью, как с кодом
Генерация вебсайта билд-системой
Удобно подключается к кодобазам проектов
48
Закрепим
Участвуйте в создании и развитии API
HTTP — не серебряная пуля
Протокол под себя — дороже, зато удобнее
Документация — максимально подробно, с примерами
Всё — в репозиторий
49
https://twitter.com/BadooTech
Спасибо!
@ikashkuta
gmail, twitter, telegram, etc.
51Дополнительные материалы
Swift Protobuf
Badoo Crazy Agile API
Versioning strategy for a complex internal API
Sphinx
Google API Design Guide
Logux
Swarm.js

Más contenido relacionado

La actualidad más candente

Обзор Drupal 8 by Andrei Khalipau, Kostya Halipov and Егор Богатырёв
Обзор Drupal 8 by Andrei Khalipau, Kostya  Halipov and Егор БогатырёвОбзор Drupal 8 by Andrei Khalipau, Kostya  Halipov and Егор Богатырёв
Обзор Drupal 8 by Andrei Khalipau, Kostya Halipov and Егор Богатырёв
Minsk PHP User Group
 
SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...
SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...
SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...
SECON
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
Sergey Xek
 

La actualidad más candente (19)

Инструментарий для создания дистрибутивов продуктов | Владимир Селин
Инструментарий для создания дистрибутивов продуктов | Владимир СелинИнструментарий для создания дистрибутивов продуктов | Владимир Селин
Инструментарий для создания дистрибутивов продуктов | Владимир Селин
 
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesИнструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
 
Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...
Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...
Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...
 
Самодиагностика сервисов на базе платформы .NET
Самодиагностика сервисов на базе платформы .NETСамодиагностика сервисов на базе платформы .NET
Самодиагностика сервисов на базе платформы .NET
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Александр Афенов
Александр АфеновАлександр Афенов
Александр Афенов
 
vSphereTools - инструмент для автоматизации работы с vSphere | Тимур Гильмуллин
vSphereTools - инструмент для автоматизации работы с vSphere | Тимур ГильмуллинvSphereTools - инструмент для автоматизации работы с vSphere | Тимур Гильмуллин
vSphereTools - инструмент для автоматизации работы с vSphere | Тимур Гильмуллин
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows Docker
 
Обзор Drupal 8 by Andrei Khalipau, Kostya Halipov and Егор Богатырёв
Обзор Drupal 8 by Andrei Khalipau, Kostya  Halipov and Егор БогатырёвОбзор Drupal 8 by Andrei Khalipau, Kostya  Halipov and Егор Богатырёв
Обзор Drupal 8 by Andrei Khalipau, Kostya Halipov and Егор Богатырёв
 
Сергей Орлов
Сергей ОрловСергей Орлов
Сергей Орлов
 
Андрей Чебукин "Построение успешных API"
Андрей Чебукин "Построение успешных API"Андрей Чебукин "Построение успешных API"
Андрей Чебукин "Построение успешных API"
 
Аналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikАналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + Qlik
 
Евгений Остапчук "Tips&Tricks for ASP.NET MVC performance"
Евгений Остапчук "Tips&Tricks for ASP.NET MVC performance"Евгений Остапчук "Tips&Tricks for ASP.NET MVC performance"
Евгений Остапчук "Tips&Tricks for ASP.NET MVC performance"
 
SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...
SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...
SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
2014 ALM Summit - ALM and 1C
2014 ALM Summit - ALM and 1C2014 ALM Summit - ALM and 1C
2014 ALM Summit - ALM and 1C
 
Развитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityРазвитие сообщества Open DevOps Community
Развитие сообщества Open DevOps Community
 
Типовая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesТиповая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive Technologies
 
C#5 What's new?
C#5 What's new?C#5 What's new?
C#5 What's new?
 

Similar a Игорь Кашкута

Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Anthony Marchenko
 
1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NET1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NET
Media Gorod
 
Victor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platformsVictor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platforms
Andrew Mayorov
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
GoSharp
 
Видеозвонки и шаринг экрана в мобильном приложении
Видеозвонки и шаринг экрана в мобильном приложенииВидеозвонки и шаринг экрана в мобильном приложении
Видеозвонки и шаринг экрана в мобильном приложении
Voximplant
 

Similar a Игорь Кашкута (20)

ITmozg, Даниил Павлючков
ITmozg, Даниил ПавлючковITmozg, Даниил Павлючков
ITmozg, Даниил Павлючков
 
DEV Labs 2016. Микросервисы - первая кровь
DEV Labs 2016. Микросервисы - первая кровьDEV Labs 2016. Микросервисы - первая кровь
DEV Labs 2016. Микросервисы - первая кровь
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработки
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
GraphQL API: Patterns | Андрей Чиж | Zlit Tech
GraphQL API: Patterns | Андрей Чиж | Zlit TechGraphQL API: Patterns | Андрей Чиж | Zlit Tech
GraphQL API: Patterns | Андрей Чиж | Zlit Tech
 
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
 
Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)
 
Проектирование по контракту
Проектирование по контрактуПроектирование по контракту
Проектирование по контракту
 
Design by Contract basics
Design by Contract basicsDesign by Contract basics
Design by Contract basics
 
Что вас ждет на пути реализации Soa (Битрикс отступает)
Что вас ждет на пути реализации Soa (Битрикс отступает)Что вас ждет на пути реализации Soa (Битрикс отступает)
Что вас ждет на пути реализации Soa (Битрикс отступает)
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
 
1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NET1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NET
 
Александр Белоцерковский "Microsoft Bot Framework" - EdHack
Александр Белоцерковский "Microsoft Bot Framework" - EdHackАлександр Белоцерковский "Microsoft Bot Framework" - EdHack
Александр Белоцерковский "Microsoft Bot Framework" - EdHack
 
Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
 
Python-технология которую легко продавать!
Python-технология которую легко продавать!Python-технология которую легко продавать!
Python-технология которую легко продавать!
 
Victor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platformsVictor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platforms
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
 
Видеозвонки и шаринг экрана в мобильном приложении
Видеозвонки и шаринг экрана в мобильном приложенииВидеозвонки и шаринг экрана в мобильном приложении
Видеозвонки и шаринг экрана в мобильном приложении
 

Más de CodeFest

Más de CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 
Алексей Акулович
Алексей АкуловичАлексей Акулович
Алексей Акулович
 

Игорь Кашкута