Upload
it-people
View
1.087
Download
3
Tags:
Embed Size (px)
Citation preview
Сергей Коржнев
РАЗРАБОТКА РАЗВЕСИСТОГО API
Крайний за архитектуру справочного API 2ГИС
Справочное API 2ГИС
http://catalog.api.2gis.ru/search
?what=музей &where=Москва &version=1.3 &key=1234567890 &output=json
API 2ГИС в цифрах
уников в месяц
online
более 500 проектов
> 10 000 000
Эффективная и полезнаямонетизация API
Р
Большой API
Сложное внутреннееустройство
Более 50 методов
Технологический стек
Аспекты
ДокументацияАвтотестыАрхитектура
Архитектура
— F(t)
— Сначала простая
— Потом чуть посложнее
Прототип
— Требования— Реализация
Маленькое API
— Просто
— Быстро
— Стандартная архитектура
Стандартный подход не работает
Борьба со сложностью
Слоистая архитектура
The Seven Layers of OSI
Physical Link
UserTransmit
DataReceive
DataApplication Layer
Physical Layer
Data Link Layer
Network Layer
Transport Layer
Session Layer
Presentation Layer
Application Layer
MVC
Model
ControllerView
Компоненты архитектурыКомпоненты архитектуры
Модель: Бизнес-логика и ActiveRecord
Представление
Контроллер
Объект запроса
Валидатор запроса
Модель
ActiveRecord
Бизнес-логика
Controller
Бизнес-логика
Yii-расширения
Класс CApplicationComponent
Yii::app()->geoCoder
Конфигурация
return array(
'components' => array(
'geoCoder' => array(
'class' => 'ext.geoCoder.ExtGeoCoder',
'country' => 'Russia'
),
...
),
);
ActiveRecord
Chuck Norris approved
Представление
Рендеринг в файлах
Рендеринг в классе
Контроллер – Представление
JSON, XML
Объект запроса
Грязный контроллер
Чистый контроллер
Объект запроса
GeoSearchRequest extends RequestModel {
public $what;
public $is_cool_place;
public function rules() {
return array(
array('WhatValidator', 'min' => 2, 'max' => 50),
array('BooleanValidator',
'param' => 'is_cool_place',
'required' => false),
);
}
}
Валидатор объекта запроса
class WhatValidator extends Validator {
public function run(RequestModel $model) {
// ...
}
}
return array(
'components' => array(
'geoCoder' => array(
'class' => 'ext.geoCoder.ExtGeoCoder',
'country' => 'Russia'
),
...
),
);
Объект запроса
Нет состояния
Декларативный подход
Наглядность
Структура директорий
/protected /controllers GeoController.php /views GeoView.php /requests /geo GeoSearchRequest.php /extensions /geo ExtGeo.php /models /components
Модель: Бизнес-логика и ActiveRecord
Представление
Контроллер
Объект запроса
Валидатор запроса
ВыводыКомпоненты архитектуры
Модель: Бизнес-логика и ActiveRecord
Представление
Контроллер
Объект запроса
Валидатор запроса
Автотесты
Гибридные тесты
Зависимости
Подмена данных
GeoSearchRequest extends RequestModel {
public $what;
public $is_cool_place;
public function rules() {
return array(
array('WhatValidator', 'min' => 2, 'max' => 50),
array('BooleanValidator',
'param' => 'is_cool_place',
'required' => false),
);
}
}
JSON Schema
Структура
Обязательность
Тип данных
XML Schema
PHP-реализация
Сам формат
http://json-schema.org/
PHP-библиотека от института Беркли
https://github.com/justinrainbow/json-schema
JSON
{ "a":10, "b":"boo" }
/protected /controllers GeoController.php /views GeoView.php /requests /geo GeoSearchRequest.php /extensions /geo ExtGeo.php /models /components
JSON Schema для него
{ "a":10, "b":"boo" }
{
"a": {
"type": "number",
"required": true
},
"b": {
"type": "string",
"required": true
}
}
Использование JSON Schema
Фильтр ответа
Тестируем в фоне
Включаем во время тестов
"additionalProperties": false
Приоритеты тестов
Публичный интерфейс
JSON Schema
Дешево
Часто используется
Бизнес-логика
Документация
— Ветка на фичу
— Вместе с кодом
— Актуальность
— Да ну её нафиг!
Тема: Бульдог + Носорог
"reviews_count": {
"type": "number",
"required": true,
"meta": {
"description": "Количество отзывов"
}
},
JSON Schema + документация
Дешевая документация
Автоматический рендеринг
Тесты на документацию
Итоги
Большой API
Архитектура
Автотесты
Документация
{
"a": {
"type": "number",
"required": true
},
"b": {
"type": "string",
"required": true
}
}
Спасибо. Вопросы[email protected]Сергей Коржнев