41
Сергей Коржнев РАЗРАБОТКА РАЗВЕСИСТОГО API

DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Embed Size (px)

Citation preview

Page 1: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Сергей Коржнев

РАЗРАБОТКА РАЗВЕСИСТОГО API

Page 2: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Крайний за архитектуру справочного API 2ГИС

Page 3: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Справочное API 2ГИС

http://catalog.api.2gis.ru/search

?what=музей &where=Москва &version=1.3 &key=1234567890 &output=json

Page 4: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

API 2ГИС в цифрах

уников в месяц

online

более 500 проектов

> 10 000 000

Эффективная и полезнаямонетизация API

Р

Page 5: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Большой API

Сложное внутреннееустройство

Более 50 методов

Page 6: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Технологический стек

Page 7: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей
Page 8: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Аспекты

ДокументацияАвтотестыАрхитектура

Page 9: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Архитектура

— F(t)

— Сначала простая

— Потом чуть посложнее

Page 10: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Прототип

— Требования— Реализация

Page 11: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Маленькое API

— Просто

— Быстро

— Стандартная архитектура

Page 12: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Стандартный подход не работает

Page 13: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Борьба со сложностью

Page 14: DUMP-2013 Serverside - Разработка развесистого 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

Page 15: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

MVC

Model

ControllerView

Page 16: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Компоненты архитектурыКомпоненты архитектуры

Модель: Бизнес-логика и ActiveRecord

Представление

Контроллер

Объект запроса

Валидатор запроса

Page 17: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Модель

ActiveRecord

Бизнес-логика

Controller

Page 18: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Бизнес-логика

Yii-расширения

Класс CApplicationComponent

Yii::app()->geoCoder

Page 19: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Конфигурация

return array(

'components' => array(

'geoCoder' => array(

'class' => 'ext.geoCoder.ExtGeoCoder',

'country' => 'Russia'

),

...

),

);

Page 20: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

ActiveRecord

Page 21: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Chuck Norris approved

Page 22: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Представление

Рендеринг в файлах

Рендеринг в классе

Контроллер – Представление

JSON, XML

Page 23: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Объект запроса

Грязный контроллер

Чистый контроллер

Page 24: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Объект запроса

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),

);

}

}

Page 25: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Валидатор объекта запроса

class WhatValidator extends Validator {

public function run(RequestModel $model) {

// ...

}

}

Page 26: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

return array(

'components' => array(

'geoCoder' => array(

'class' => 'ext.geoCoder.ExtGeoCoder',

'country' => 'Russia'

),

...

),

);

Объект запроса

Нет состояния

Декларативный подход

Наглядность

Page 27: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Структура директорий

/protected /controllers GeoController.php /views GeoView.php /requests /geo GeoSearchRequest.php /extensions /geo ExtGeo.php /models /components

Page 28: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Модель: Бизнес-логика и ActiveRecord

Представление

Контроллер

Объект запроса

Валидатор запроса

ВыводыКомпоненты архитектуры

Модель: Бизнес-логика и ActiveRecord

Представление

Контроллер

Объект запроса

Валидатор запроса

Page 29: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Автотесты

Page 30: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Гибридные тесты

Зависимости

Подмена данных

Page 31: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

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

Page 32: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

PHP-реализация

Сам формат

http://json-schema.org/

PHP-библиотека от института Беркли

https://github.com/justinrainbow/json-schema

Page 33: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

JSON

{ "a":10, "b":"boo" }

Page 34: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

/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

}

}

Page 35: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Использование JSON Schema

Фильтр ответа

Тестируем в фоне

Включаем во время тестов

"additionalProperties": false

Page 36: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Приоритеты тестов

Публичный интерфейс

JSON Schema

Дешево

Часто используется

Бизнес-логика

Page 37: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Документация

— Ветка на фичу

— Вместе с кодом

— Актуальность

— Да ну её нафиг!

Page 38: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Тема: Бульдог + Носорог

"reviews_count": {

"type": "number",

"required": true,

"meta": {

"description": "Количество отзывов"

}

},

Page 39: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

JSON Schema + документация

Дешевая документация

Автоматический рендеринг

Тесты на документацию

Page 40: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

Итоги

Большой API

Архитектура

Автотесты

Документация

Page 41: DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей

{

"a": {

"type": "number",

"required": true

},

"b": {

"type": "string",

"required": true

}

}

Спасибо. Вопросы[email protected]Сергей Коржнев