Я расскажу о том, как мы разрабатываем фронтенд и бэкенд параллельно, используя protobuf + JSON RPC.
Часто фронтенд выставляет требования к бэкенду, из этих требований получается API, и разработка возможна только при одновременной работе серверного и клиентского девелопера.
Мы же начинаем разработку с API, и фронтенд (а также мобильные приложения) никак не зависят от степени готовности бэкенда.
– Я поделюсь тем, как мы делаем API до начала разработки;
– Success story использования protobuf + RPC;
– И немного – о разработке клиента вообще без серверного кода.
15. Наши требования
• Одно API для всех платформ
• Документация всего
• Работа с нативными клиентами (смартфоны)
• Минимум запросов
• Нет избыточных данных
• Типизация
• Версионирование
24. Чего хочется
• Писать API в общем проекте с другими
разработчиками
• Хранить API в текстовом формате, лучше – в
обычной VCS
• Получать удобное и структурированное ТЗ на
выходе
• Удобный формат для бэкенда и клиентов
25. Наше решение
• Google Protocol Buffers
• Описание в .proto-файлах
• Типизированный
• Поддержка большинства популярных языков
• Бинарная сериализация по умолчанию
• Можно использовать другую сериализацию
38. var body = new ServerGetPopularity()
.setUserId(this._userId)
new GpbRpc
(
MessageType.SERVER_GET_POPULARITY,
body
)
.on(
MessageType.CLIENT_POPULARITY,
this.requestReady,
this)
.on(
MessageType.CLIENT_PHOTO_REQUIRED,
this.requestError,
this);
39. var body = new ServerGetPopularity()
.setUserId(this._userId)
new GpbRpc
(
MessageType.SERVER_GET_POPULARITY,
body
)
.on(
MessageType.CLIENT_POPULARITY,
this.requestReady,
this)
.on(
MessageType.CLIENT_PHOTO_REQUIRED,
this.requestError,
this);
40. var body = new ServerGetPopularity()
.setUserId(this._userId)
new GpbRpc
(
MessageType.SERVER_GET_POPULARITY,
body
)
.on(
MessageType.CLIENT_POPULARITY,
this.requestReady,
this)
.on(
MessageType.CLIENT_PHOTO_REQUIRED,
this.requestError,
this);
41. var body = new ServerGetPopularity()
.setUserId(this._userId)
new GpbRpc
(
MessageType.SERVER_GET_POPULARITY,
body
)
.on(
MessageType.CLIENT_POPULARITY,
this.requestReady,
this)
.on(
MessageType.CLIENT_PHOTO_REQUIRED,
this.photoRequired,
this);
44. var user = new User()
.setProjection([
UserField.USER_FIELD_NAME,
UserField.USER_FIELD_PROFILE_PHOTO,
UserField.USER_FIELD_SOCIAL_NETWORKS,
UserField.USER_FIELD_PHOTO_COUNT,
UserField.USER_FIELD_COUNTRY,
UserField.USER_FIELD_CREDITS,
UserField.USER_FIELD_GENDER
]);
new GpbRpc(MessageType.SERVER_GET_USER, user)
57. Версионирование
• Поля не удаляются из протокола
• Старые поля помечаются как deprecated или
obsolete
• Obsolete — поле, которое не будет
использоваться в следующих версиях
• Deprecated — поле, которое не используют
новые версии платформ