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

Preview:

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

}

}

Спасибо. Вопросы?s.korzhnev@2gis.ruСергей Коржнев

Recommended