SlideShare a Scribd company logo
1 of 55
Topic RESTful API
Best practices, versioning, design
documentation
Speaker Vyacheslav Mikhaylov (vmikhaylov@dataart.com)
SPB .NET Meetup #8
1
О чем доклад?
• Что такое API и зачем он нужен?
• Основы REST
• На чем реализовывать?
• Бест-практики
• Как проектировать?
• Документация и версионирование
2
Что такое API?
Aplication
Program
Interface
Набор правил и механизмов
(на самом деле это все знают)
3
Почему хороший API это важно?
• Простота использования и поддержки
• Конверсия в среде разработчиков (потребителей).
• Больше бользователей  API -> выше популярность сервиса
• Лучше структура -> лучше изоляция компонентов
• API это UI для разработчиков
4
Какие виды API бывают?
• Web service APIs
• XML-RPC and JSON-RPC
• SOAP
• REST
• WebSockets APIs
• Library-based APIs
• Java Script
• Class-based APIs
• C# API, Java
• OS function and routines
• Access to file system
• Access to user interface
• Object remoting APIs
• CORBA
• .Net remoting
• Hardware APIs
• Video acceleration (OpenCL…)
• Hard disk drives
• PCI bus
• …
5
Какие виды API нас интересуют?
Web service APIs
• XML-RPC and JSON-RPC
• SOAP – Simple  Object Acces Protocol
• REST
6
Что такое REST?
Representative
State
Transfer
Это не протокол. И не стандарт. Это архитектурный стиль
(это тоже все знают)
7
Принципы REST?
• Клиент-серверная архитектура
• Любые данные являются ресурсом
• Любой ресурс имеет ID
• Ресурсы связаны между собой
• Используются стандартные методы HTTP
• Сервер не хранит состояние
8
Чем REST хорош?
• Он простой!
• Переиспользуем существующие стандарты
• REST базируется на HTTP => доступны все плюшки
• Кеширование
• Масштабирование
• Минимум накладных расходов
• Стандартные коды ошибок
• Очень хорошая распространённость (даже IoT)
9
Best-practices (независимые от технологий)
• SSL everywhere
• Documentation & Versioning
• POST, PUT should return data
• Filtering, sorting, pagination
• Support MediaType
• Pretty print & gzip
• Standard caching by ETag & Last-Modified
• Use standard error codes and predefined error format
10
Свойства HTTP методов
11
HTTP Method Idempotent Safe
OPTIONS Yes Yes
GET Yes Yes
HEAD Yes Yes
PUT Yes No
POST No No
DELETE Yes No
PATCH Yes No
Что такое RESTful API?
Это такой сервис, который
удовлетворяет принципам REST
12
Выбираем технологию
WCF Services
– webHttpBinding only(а зачем
тогда остальные?)
– Поддерживаются только HTTP
Get & POST (и все)
+ Разные форматы XML, JSON,
ATOM
Web Api
+ Очень простой
+ Open source
+ Все возможности HTTP
+ Все возможности MVC
+ Легкий (не жирный )
+ Тоже поддерживает кучу
форматов
13
Выбираем хостинг для WebApi
•ASP.NET MVC
•OWIN – Open Web Interface for .Net
•IIS
•Self-hosted
•Azure
14
Идея OWIN
• Это спецификация (не библиотека и не платформа)
• Устраняет сильную связанность веб приложения с реализацией
сервера
15
Katana – реализация OWIN от Microsoft
[assembly: OwinStartup(typeof (Startup))]
namespace RestApiDemo
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseWebApi(config);
}
}
}
16
Проектируем интерфейс
• Все ресурсы в REST существительные (множественное число)
• Корневые сущности API
• GET /stations - Все вокзалы
• GET /stations/123 - Информация по вокзалу с ID = 123
• GET /trains - Все поезда
• Зависимые сущности
• GET /stations/555/departures – поезда уходящие с вокзала 555
17
Простейший контроллер
[RoutePrefix("stations")]
public class RailwayStationsController : ApiController
{
[HttpGet]
[Route]
public IEnumerable<RailwayStationModel> GetAll()
{
return testData;
}
RailwayStationModel[] testData = /*initialization here*/
}
18
“Много” данных?
•100?
•1000?
•1000000?
> 100 редко нужно на клиенте
19
OData (www.odata.org)
[RoutePrefix("stations")]
public class RailwayStationsController : ApiController
{
[HttpGet]
[Route]
[EnableQuery]
public IQueryable<RailwayStationModel> GetAll()
{
return testData.AsQueryable();
}
RailwayStationModel[] testData = /*initialization here*/
}
20
Параметры запросов
Query Option Sample
$filter Stations?$filter=Name eq 'Московский вокзал'
Stations?$filter=contains(Name, 'Лад')
$select Stations?$select=Name, Id
$orderby Stations?$orderby=Name desc
$top Trains?$top=40.
$skip Trains?$skip=1000&$top=40
21
EnableQuery Attribute
• AllowedArithmeticOperators
• AllowedFunctions
• AllowedLogicalOperators
• AllowedOrderByProperties
• AllowedQueryOptions
• EnableConstantParameterization
• EnsureStableOrdering
• HandleNullPropagation
• MaxAnyAllExpressionDepth
• MaxExpansionDepth
• MaxNodeCount
• MaxOrderByNodeCount
• MaxSkip
• MaxTop
• PageSize
22
Примеры запросов REST
• GET /stations– получить все вокзалы
• GET /trains – расписание всех поездов
• GET /stations/555/arrivals
• GET /stations/555/departures
23
Зависимый контроллер
[RoutePrefix("stations/{station}/departures")]
public class TrainsFromController : TrainsController
{
[HttpGet]
[Route]
[EnableQuery]
public IQueryable<TrainTripModel> GetAll(int station)
{
return GetAllTrips().Where(x => x.OriginRailwayStationId == station);
}
}
24
public static class TrainsFromControllerRoutes
{
public const string BasePrefix =
RailwayStationsControllerRoutes.BasePrefix +
"/{station:int}/departures";
public const string GetById = "{id:int}";
}
25
Константы для роутинга
[RoutePrefix(TrainsFromControllerRoutes.BasePrefix)]
public class TrainsFromController : TrainsController
{
[HttpGet]
[Route]
[EnableQuery]
public IQueryable<TrainTripModel> GetAll(int station)
{
return GetAll().Where(x => x.OriginRailwayStationId == station);
}
}
26
Зависимый контроллер еще раз
Базовый CRUD
• POST – создать новую сущность
• POST /Stations – JSON описание сущности целиком. Действие добавляет новую сущность
в коллекцию
• Возвращает созданную сущность
• PUT – изменить сущность
• PUT /Stations/12 – Изменить сущность с ID = 12.
• Возвращает измененную сущность
• DELETE
• DELETE /Stations/12 – Удалить сущность с ID = 12.
27
Еще примеры CRUD
• POST /Stations – Добавляем вокзал
• POST /Stations/1/Departures – Добавляем информацию об отправлении с вокзала 1
• DELETE /Stations/1/Departures/14 – Удаляем запись об отправлении с вокзала 1
• GET /Stations/33/Departures/10/Tickets – Список проданных билетов для
отправления 10 с вокзала 33
28
Naming anti-patterns
• GET /Stations/?op=departure&train=11
• действия в query string
• GET /Stations/DeleteAll
• реальный пример из жизни :)
• борьба с кешированием
• POST /GetUserActivity
• пост нужен был из-за параметров запроса в body
• POST /Stations/Create
• действие указано в составе URL - избыточно
29
Проектируем API
• Как связаны сущности API с доменной моделью?
• Никак они не связаны 
• Как проектировать API если это не CRUD
• Превращаем действия в команды на изменения
30
Доменная модель
31
Коротенько про DDD
• Bounded Context
• Aggregates
• Entities
• Values Objects
32
Bounded context (BC)
• Изолированный поддомен
• Независимы друг от друга
• Имеют независимые модели (разные)
• BC <= component
33
Aggregates
• Целостная (consistent) группа сущностей
• Цель – гарантироваться целостность и согласованность всех
объектов
• Aggregate root (AR) – самый «главный» объект в группе
• Все изменения только через AR
• Сущности из разных Aggregate Root не могут ссылаться друг на
друга
34
Domain Entities
• Уникальны по ID
• Важно отличать один объекта от другого
35
Values Objects
• Определен своими данными
• Уникальность не имеет значения
36
Доменная модель
37
Примеры запросов
• PUT /hotels/555/rooms/105/attachedDevices – заменить всю
коллекцию привязанных устройств на новую
• POST /hotels/555/rooms/105/attachedDevices – привязать еще
одно устройство
• DELETE /hotels/12 – удалить описание отеля с ID = 12
• POST /hotels/123/reservations – создать новую резервацию в
отеле id=123
38
CQRS
39
REST without PUT
• Change entity XXX => New COMMAND to change entity XXX
• Можно отслеживать статус выполнения
• Можно отменять команды (DELETE)
• Легко хранить историю изменений
• Пользователь сообщает о намерениях
40
Fine Grained VS Coarse Grained
• Много маленьких объектов
• Бизнес логика уходит на
сторону клиента
• Нужно знать как связаны
объекты
• Сложно делать локальные
изменения например
• POST /blogs/{id}/likes
• Нужно отслеживать состояние
на клиенте
• Большие объекты нельзя
сохранить частично
41
Версионирование
• Если вы однажды опубликовали контракт, то вы обязаны его
соблюдать
• Braking changes можно делать только при изменении версии
42
Подходы к версионированию
Type Sample Complexity
URL {host}/api/v2/… Minimum
Custom Header api-version:2 Average
Custom Accept Header Accept:application/vnd.trainmodel.v2+json Maximum
43
Подходы к версионированию
• http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/
NamespaceControllerSelector
• http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/
RoutingConstraintsSample
• http://www.strathweb.com/2015/10/global-route-prefixes-with-
attribute-routing-in-asp-net-web-api/
• https://github.com/climax-media/climax-web-http
44
Библиотека Climax.Web.Http
• [VersionedRoute("v2/values", Version = 2)]
• config.ConfigureVersioning(
versioningHeaderName: "version", vesioningMediaTypes: null);
• config.ConfigureVersioning(
versioningHeaderName: null,
vesioningMediaTypes: new [] { "application/vnd.model"});
45
Документация
Swagger & swashbuckle
• http://swagger.io/
• https://github.com/domaindrivendev/Swashbuckle
46
Swashbuckle
httpConfiguration
.EnableSwagger(c => c.SingleApiVersion("v1", ”Demo API"))
.EnableSwaggerUi();
47
public static void RegisterSwagger(this HttpConfiguration config)
{
config.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "DotNextRZD.PublicAPI")
.Description("DotNextRZD Public API")
.TermsOfService("Terms and conditions")
.Contact(cc => cc
.Name("Vyacheslav Mikhaylov")
.Url("http://www.dotnextrzd.com")
.Email("vmikhaylov@dataart.com"))
.License(lc => lc.Name("License").Url("http://tempuri.org/license"));
c.IncludeXmlComments(GetXmlCommentFile());
c.GroupActionsBy(GetControllerGroupingKey);
c.OrderActionGroupsBy(new CustomActionNameComparer());
c.CustomProvider(p => new CustomSwaggerProvider(config, p));
})
.EnableSwaggerUi(
c =>
{
c.InjectStylesheet(Assembly.GetExecutingAssembly(),
"DotNextRZD.PublicApi.Swagger.Styles.SwaggerCustom.css");
});
}
} 48
public static void RegisterSwagger(this HttpConfiguration config)
{
config.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "DotNextRZD.PublicAPI")
.Description("DotNextRZD Public API")
.TermsOfService("Terms and conditions")
.Contact(cc => cc
.Name("Vyacheslav Mikhaylov")
.Url("http://www.dotnextrzd.com")
.Email("vmikhaylov@dataart.com"))
.License(lc => lc.Name("License").Url("http://tempuri.org/license"));
c.IncludeXmlComments(GetXmlCommentFile());
c.GroupActionsBy(GetControllerGroupingKey);
c.OrderActionGroupsBy(new CustomActionNameComparer());
c.CustomProvider(p => new CustomSwaggerProvider(config, p));
})
.EnableSwaggerUi(
c =>
{
c.InjectStylesheet(Assembly.GetExecutingAssembly(),
"DotNextRZD.PublicApi.Swagger.Styles.SwaggerCustom.css");
});
}
} 49
50
51
52
53
Источники
• http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
• http://www.strathweb.com/2015/10/global-route-prefixes-with-attribute-routing-in-asp-net-web-api/
• https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling
• https://jacobian.org/writing/rest-worst-practices/
• http://piwik.org/blog/2008/01/how-to-design-an-api-best-practises-concepts-technical-aspects/
• http://www.toptal.com/api-developers/5-golden-rules-for-designing-a-great-web-api
• http://www.odata.org/
• http://owin.org/
• http://pietschsoft.com/post/2014/06/15/cqrs-command-query-responsibility-segregation-design-pattern
• https://blog.pivotal.io/pivotal-labs/labs/api-versioning
54
Thank you
To be continued…

More Related Content

What's hot

Rambler.iOS #2: Практика применения BaaS в мобильных сервисах
Rambler.iOS #2: Практика применения BaaS в мобильных сервисахRambler.iOS #2: Практика применения BaaS в мобильных сервисах
Rambler.iOS #2: Практика применения BaaS в мобильных сервисахRAMBLER&Co
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Ontico
 
Игорь Кашкута
Игорь КашкутаИгорь Кашкута
Игорь КашкутаCodeFest
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 
Service Discovery. More that it seems
Service Discovery. More that it seemsService Discovery. More that it seems
Service Discovery. More that it seemsAleksandr Tarasov
 
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"Fwdays
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?Aleksey Stukalov
 
4 особенности платформы microsoft .net для разработки корпоративных систем
4 особенности платформы microsoft .net для разработки корпоративных систем4 особенности платформы microsoft .net для разработки корпоративных систем
4 особенности платформы microsoft .net для разработки корпоративных системKewpaN
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, WambaOntico
 
8 создание приложений по технологии windows communications foundation
8 создание приложений по технологии windows communications foundation8 создание приложений по технологии windows communications foundation
8 создание приложений по технологии windows communications foundationKewpaN
 
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр КовалевПакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр КовалевPositive Hack Days
 
Будущее ASP.NET
Будущее ASP.NETБудущее ASP.NET
Будущее ASP.NETGoSharp
 
Браузерные помощники тестировщика (QA Fest 2016)
Браузерные помощники тестировщика (QA Fest 2016)Браузерные помощники тестировщика (QA Fest 2016)
Браузерные помощники тестировщика (QA Fest 2016)Alexander Nedeliaev
 
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remotingKewpaN
 
Meet up windows-workflow_foundation
Meet up windows-workflow_foundationMeet up windows-workflow_foundation
Meet up windows-workflow_foundationIgor Khokhryakov
 
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере" Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"MskDotNet Community
 
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...QAFest
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 

What's hot (20)

Rambler.iOS #2: Практика применения BaaS в мобильных сервисах
Rambler.iOS #2: Практика применения BaaS в мобильных сервисахRambler.iOS #2: Практика применения BaaS в мобильных сервисах
Rambler.iOS #2: Практика применения BaaS в мобильных сервисах
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...
 
Игорь Кашкута
Игорь КашкутаИгорь Кашкута
Игорь Кашкута
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Service Discovery. More that it seems
Service Discovery. More that it seemsService Discovery. More that it seems
Service Discovery. More that it seems
 
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?
 
4 особенности платформы microsoft .net для разработки корпоративных систем
4 особенности платформы microsoft .net для разработки корпоративных систем4 особенности платформы microsoft .net для разработки корпоративных систем
4 особенности платформы microsoft .net для разработки корпоративных систем
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
 
8 создание приложений по технологии windows communications foundation
8 создание приложений по технологии windows communications foundation8 создание приложений по технологии windows communications foundation
8 создание приложений по технологии windows communications foundation
 
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр КовалевПакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
 
Будущее ASP.NET
Будущее ASP.NETБудущее ASP.NET
Будущее ASP.NET
 
Браузерные помощники тестировщика (QA Fest 2016)
Браузерные помощники тестировщика (QA Fest 2016)Браузерные помощники тестировщика (QA Fest 2016)
Браузерные помощники тестировщика (QA Fest 2016)
 
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting
 
Meet up windows-workflow_foundation
Meet up windows-workflow_foundationMeet up windows-workflow_foundation
Meet up windows-workflow_foundation
 
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере" Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 

Viewers also liked

WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемноMikhail Shcherbakov
 
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действииMikhail Shcherbakov
 
Обзор технологических новинок в .Net с точки зрения Web-программиста
Обзор технологических новинок в .Net с точки зрения Web-программистаОбзор технологических новинок в .Net с точки зрения Web-программиста
Обзор технологических новинок в .Net с точки зрения Web-программистаMikhail Shcherbakov
 
Development Lifecycle: From Requirement to Release
Development Lifecycle: From Requirement to ReleaseDevelopment Lifecycle: From Requirement to Release
Development Lifecycle: From Requirement to ReleaseJulie Meloni
 
Api Versioning
Api VersioningApi Versioning
Api VersioningBen Ramsey
 

Viewers also liked (6)

WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемно
 
Structured logging
Structured loggingStructured logging
Structured logging
 
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действии
 
Обзор технологических новинок в .Net с точки зрения Web-программиста
Обзор технологических новинок в .Net с точки зрения Web-программистаОбзор технологических новинок в .Net с точки зрения Web-программиста
Обзор технологических новинок в .Net с точки зрения Web-программиста
 
Development Lifecycle: From Requirement to Release
Development Lifecycle: From Requirement to ReleaseDevelopment Lifecycle: From Requirement to Release
Development Lifecycle: From Requirement to Release
 
Api Versioning
Api VersioningApi Versioning
Api Versioning
 

Similar to RESTful API: Best practices, versioning, design documentation

Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETDev2Dev
 
Модульная структура
Модульная структураМодульная структура
Модульная структураDenis Tsvettsih
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCGetDev.NET
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukWeb and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukInterSystems
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéРазработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéInterSystems CEE
 
Опыт работы с фреймворком ASP.NET MVC
Опыт работы с фреймворком ASP.NET MVCОпыт работы с фреймворком ASP.NET MVC
Опыт работы с фреймворком ASP.NET MVCДаниил Силантьев
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, ParallelsNikolay Samokhvalov
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?buranLcme
 
Развитие сетевой архитектуры для ЦОД Cisco ACI
Развитие сетевой архитектуры для ЦОД Cisco ACI Развитие сетевой архитектуры для ЦОД Cisco ACI
Развитие сетевой архитектуры для ЦОД Cisco ACI Cisco Russia
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCAndrew Mayorov
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipesAlexey Ermakov
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014InterSystems
 
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?SECON
 
Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"Fwdays
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAndrey Rebrov
 

Similar to RESTful API: Best practices, versioning, design documentation (20)

Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVC
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukWeb and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard Lebedyuk
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéРазработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для Caché
 
Опыт работы с фреймворком ASP.NET MVC
Опыт работы с фреймворком ASP.NET MVCОпыт работы с фреймворком ASP.NET MVC
Опыт работы с фреймворком ASP.NET MVC
 
Coding like a sex
Coding like a sexCoding like a sex
Coding like a sex
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
 
Развитие сетевой архитектуры для ЦОД Cisco ACI
Развитие сетевой архитектуры для ЦОД Cisco ACI Развитие сетевой архитектуры для ЦОД Cisco ACI
Развитие сетевой архитектуры для ЦОД Cisco ACI
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
MySQL 8.0
MySQL 8.0MySQL 8.0
MySQL 8.0
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipes
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
 
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
 
Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile Projects
 

More from Mikhail Shcherbakov

Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application SecurityMikhail Shcherbakov
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Mikhail Shcherbakov
 
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NETMikhail Shcherbakov
 
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridMikhail Shcherbakov
 
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатораMikhail Shcherbakov
 
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Mikhail Shcherbakov
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3. Mikhail Shcherbakov
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаMikhail Shcherbakov
 
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахMikhail Shcherbakov
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.Mikhail Shcherbakov
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийMikhail Shcherbakov
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++Mikhail Shcherbakov
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLRMikhail Shcherbakov
 
Visual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsVisual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsMikhail Shcherbakov
 
Разработка мобильных приложений на С# с использованием Xamarin
Разработка мобильных  приложений на С# с использованием XamarinРазработка мобильных  приложений на С# с использованием Xamarin
Разработка мобильных приложений на С# с использованием XamarinMikhail Shcherbakov
 

More from Mikhail Shcherbakov (20)

Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
 
Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application Security
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NET
 
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data Grid
 
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатора
 
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
Project Rider
Project RiderProject Rider
Project Rider
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектах
 
Sandboxing in .NET CLR
Sandboxing in .NET CLRSandboxing in .NET CLR
Sandboxing in .NET CLR
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
 
Visual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsVisual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging Tools
 
Разработка мобильных приложений на С# с использованием Xamarin
Разработка мобильных  приложений на С# с использованием XamarinРазработка мобильных  приложений на С# с использованием Xamarin
Разработка мобильных приложений на С# с использованием Xamarin
 
Roslyn Code Analysis
Roslyn Code AnalysisRoslyn Code Analysis
Roslyn Code Analysis
 
What's New in C# 6
What's New in C# 6What's New in C# 6
What's New in C# 6
 

RESTful API: Best practices, versioning, design documentation

  • 1. Topic RESTful API Best practices, versioning, design documentation Speaker Vyacheslav Mikhaylov (vmikhaylov@dataart.com) SPB .NET Meetup #8 1
  • 2. О чем доклад? • Что такое API и зачем он нужен? • Основы REST • На чем реализовывать? • Бест-практики • Как проектировать? • Документация и версионирование 2
  • 3. Что такое API? Aplication Program Interface Набор правил и механизмов (на самом деле это все знают) 3
  • 4. Почему хороший API это важно? • Простота использования и поддержки • Конверсия в среде разработчиков (потребителей). • Больше бользователей  API -> выше популярность сервиса • Лучше структура -> лучше изоляция компонентов • API это UI для разработчиков 4
  • 5. Какие виды API бывают? • Web service APIs • XML-RPC and JSON-RPC • SOAP • REST • WebSockets APIs • Library-based APIs • Java Script • Class-based APIs • C# API, Java • OS function and routines • Access to file system • Access to user interface • Object remoting APIs • CORBA • .Net remoting • Hardware APIs • Video acceleration (OpenCL…) • Hard disk drives • PCI bus • … 5
  • 6. Какие виды API нас интересуют? Web service APIs • XML-RPC and JSON-RPC • SOAP – Simple  Object Acces Protocol • REST 6
  • 7. Что такое REST? Representative State Transfer Это не протокол. И не стандарт. Это архитектурный стиль (это тоже все знают) 7
  • 8. Принципы REST? • Клиент-серверная архитектура • Любые данные являются ресурсом • Любой ресурс имеет ID • Ресурсы связаны между собой • Используются стандартные методы HTTP • Сервер не хранит состояние 8
  • 9. Чем REST хорош? • Он простой! • Переиспользуем существующие стандарты • REST базируется на HTTP => доступны все плюшки • Кеширование • Масштабирование • Минимум накладных расходов • Стандартные коды ошибок • Очень хорошая распространённость (даже IoT) 9
  • 10. Best-practices (независимые от технологий) • SSL everywhere • Documentation & Versioning • POST, PUT should return data • Filtering, sorting, pagination • Support MediaType • Pretty print & gzip • Standard caching by ETag & Last-Modified • Use standard error codes and predefined error format 10
  • 11. Свойства HTTP методов 11 HTTP Method Idempotent Safe OPTIONS Yes Yes GET Yes Yes HEAD Yes Yes PUT Yes No POST No No DELETE Yes No PATCH Yes No
  • 12. Что такое RESTful API? Это такой сервис, который удовлетворяет принципам REST 12
  • 13. Выбираем технологию WCF Services – webHttpBinding only(а зачем тогда остальные?) – Поддерживаются только HTTP Get & POST (и все) + Разные форматы XML, JSON, ATOM Web Api + Очень простой + Open source + Все возможности HTTP + Все возможности MVC + Легкий (не жирный ) + Тоже поддерживает кучу форматов 13
  • 14. Выбираем хостинг для WebApi •ASP.NET MVC •OWIN – Open Web Interface for .Net •IIS •Self-hosted •Azure 14
  • 15. Идея OWIN • Это спецификация (не библиотека и не платформа) • Устраняет сильную связанность веб приложения с реализацией сервера 15
  • 16. Katana – реализация OWIN от Microsoft [assembly: OwinStartup(typeof (Startup))] namespace RestApiDemo { public class Startup { public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); app.UseWebApi(config); } } } 16
  • 17. Проектируем интерфейс • Все ресурсы в REST существительные (множественное число) • Корневые сущности API • GET /stations - Все вокзалы • GET /stations/123 - Информация по вокзалу с ID = 123 • GET /trains - Все поезда • Зависимые сущности • GET /stations/555/departures – поезда уходящие с вокзала 555 17
  • 18. Простейший контроллер [RoutePrefix("stations")] public class RailwayStationsController : ApiController { [HttpGet] [Route] public IEnumerable<RailwayStationModel> GetAll() { return testData; } RailwayStationModel[] testData = /*initialization here*/ } 18
  • 19. “Много” данных? •100? •1000? •1000000? > 100 редко нужно на клиенте 19
  • 20. OData (www.odata.org) [RoutePrefix("stations")] public class RailwayStationsController : ApiController { [HttpGet] [Route] [EnableQuery] public IQueryable<RailwayStationModel> GetAll() { return testData.AsQueryable(); } RailwayStationModel[] testData = /*initialization here*/ } 20
  • 21. Параметры запросов Query Option Sample $filter Stations?$filter=Name eq 'Московский вокзал' Stations?$filter=contains(Name, 'Лад') $select Stations?$select=Name, Id $orderby Stations?$orderby=Name desc $top Trains?$top=40. $skip Trains?$skip=1000&$top=40 21
  • 22. EnableQuery Attribute • AllowedArithmeticOperators • AllowedFunctions • AllowedLogicalOperators • AllowedOrderByProperties • AllowedQueryOptions • EnableConstantParameterization • EnsureStableOrdering • HandleNullPropagation • MaxAnyAllExpressionDepth • MaxExpansionDepth • MaxNodeCount • MaxOrderByNodeCount • MaxSkip • MaxTop • PageSize 22
  • 23. Примеры запросов REST • GET /stations– получить все вокзалы • GET /trains – расписание всех поездов • GET /stations/555/arrivals • GET /stations/555/departures 23
  • 24. Зависимый контроллер [RoutePrefix("stations/{station}/departures")] public class TrainsFromController : TrainsController { [HttpGet] [Route] [EnableQuery] public IQueryable<TrainTripModel> GetAll(int station) { return GetAllTrips().Where(x => x.OriginRailwayStationId == station); } } 24
  • 25. public static class TrainsFromControllerRoutes { public const string BasePrefix = RailwayStationsControllerRoutes.BasePrefix + "/{station:int}/departures"; public const string GetById = "{id:int}"; } 25 Константы для роутинга
  • 26. [RoutePrefix(TrainsFromControllerRoutes.BasePrefix)] public class TrainsFromController : TrainsController { [HttpGet] [Route] [EnableQuery] public IQueryable<TrainTripModel> GetAll(int station) { return GetAll().Where(x => x.OriginRailwayStationId == station); } } 26 Зависимый контроллер еще раз
  • 27. Базовый CRUD • POST – создать новую сущность • POST /Stations – JSON описание сущности целиком. Действие добавляет новую сущность в коллекцию • Возвращает созданную сущность • PUT – изменить сущность • PUT /Stations/12 – Изменить сущность с ID = 12. • Возвращает измененную сущность • DELETE • DELETE /Stations/12 – Удалить сущность с ID = 12. 27
  • 28. Еще примеры CRUD • POST /Stations – Добавляем вокзал • POST /Stations/1/Departures – Добавляем информацию об отправлении с вокзала 1 • DELETE /Stations/1/Departures/14 – Удаляем запись об отправлении с вокзала 1 • GET /Stations/33/Departures/10/Tickets – Список проданных билетов для отправления 10 с вокзала 33 28
  • 29. Naming anti-patterns • GET /Stations/?op=departure&train=11 • действия в query string • GET /Stations/DeleteAll • реальный пример из жизни :) • борьба с кешированием • POST /GetUserActivity • пост нужен был из-за параметров запроса в body • POST /Stations/Create • действие указано в составе URL - избыточно 29
  • 30. Проектируем API • Как связаны сущности API с доменной моделью? • Никак они не связаны  • Как проектировать API если это не CRUD • Превращаем действия в команды на изменения 30
  • 32. Коротенько про DDD • Bounded Context • Aggregates • Entities • Values Objects 32
  • 33. Bounded context (BC) • Изолированный поддомен • Независимы друг от друга • Имеют независимые модели (разные) • BC <= component 33
  • 34. Aggregates • Целостная (consistent) группа сущностей • Цель – гарантироваться целостность и согласованность всех объектов • Aggregate root (AR) – самый «главный» объект в группе • Все изменения только через AR • Сущности из разных Aggregate Root не могут ссылаться друг на друга 34
  • 35. Domain Entities • Уникальны по ID • Важно отличать один объекта от другого 35
  • 36. Values Objects • Определен своими данными • Уникальность не имеет значения 36
  • 38. Примеры запросов • PUT /hotels/555/rooms/105/attachedDevices – заменить всю коллекцию привязанных устройств на новую • POST /hotels/555/rooms/105/attachedDevices – привязать еще одно устройство • DELETE /hotels/12 – удалить описание отеля с ID = 12 • POST /hotels/123/reservations – создать новую резервацию в отеле id=123 38
  • 40. REST without PUT • Change entity XXX => New COMMAND to change entity XXX • Можно отслеживать статус выполнения • Можно отменять команды (DELETE) • Легко хранить историю изменений • Пользователь сообщает о намерениях 40
  • 41. Fine Grained VS Coarse Grained • Много маленьких объектов • Бизнес логика уходит на сторону клиента • Нужно знать как связаны объекты • Сложно делать локальные изменения например • POST /blogs/{id}/likes • Нужно отслеживать состояние на клиенте • Большие объекты нельзя сохранить частично 41
  • 42. Версионирование • Если вы однажды опубликовали контракт, то вы обязаны его соблюдать • Braking changes можно делать только при изменении версии 42
  • 43. Подходы к версионированию Type Sample Complexity URL {host}/api/v2/… Minimum Custom Header api-version:2 Average Custom Accept Header Accept:application/vnd.trainmodel.v2+json Maximum 43
  • 44. Подходы к версионированию • http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ NamespaceControllerSelector • http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ RoutingConstraintsSample • http://www.strathweb.com/2015/10/global-route-prefixes-with- attribute-routing-in-asp-net-web-api/ • https://github.com/climax-media/climax-web-http 44
  • 45. Библиотека Climax.Web.Http • [VersionedRoute("v2/values", Version = 2)] • config.ConfigureVersioning( versioningHeaderName: "version", vesioningMediaTypes: null); • config.ConfigureVersioning( versioningHeaderName: null, vesioningMediaTypes: new [] { "application/vnd.model"}); 45
  • 46. Документация Swagger & swashbuckle • http://swagger.io/ • https://github.com/domaindrivendev/Swashbuckle 46
  • 48. public static void RegisterSwagger(this HttpConfiguration config) { config.EnableSwagger(c => { c.SingleApiVersion("v1", "DotNextRZD.PublicAPI") .Description("DotNextRZD Public API") .TermsOfService("Terms and conditions") .Contact(cc => cc .Name("Vyacheslav Mikhaylov") .Url("http://www.dotnextrzd.com") .Email("vmikhaylov@dataart.com")) .License(lc => lc.Name("License").Url("http://tempuri.org/license")); c.IncludeXmlComments(GetXmlCommentFile()); c.GroupActionsBy(GetControllerGroupingKey); c.OrderActionGroupsBy(new CustomActionNameComparer()); c.CustomProvider(p => new CustomSwaggerProvider(config, p)); }) .EnableSwaggerUi( c => { c.InjectStylesheet(Assembly.GetExecutingAssembly(), "DotNextRZD.PublicApi.Swagger.Styles.SwaggerCustom.css"); }); } } 48
  • 49. public static void RegisterSwagger(this HttpConfiguration config) { config.EnableSwagger(c => { c.SingleApiVersion("v1", "DotNextRZD.PublicAPI") .Description("DotNextRZD Public API") .TermsOfService("Terms and conditions") .Contact(cc => cc .Name("Vyacheslav Mikhaylov") .Url("http://www.dotnextrzd.com") .Email("vmikhaylov@dataart.com")) .License(lc => lc.Name("License").Url("http://tempuri.org/license")); c.IncludeXmlComments(GetXmlCommentFile()); c.GroupActionsBy(GetControllerGroupingKey); c.OrderActionGroupsBy(new CustomActionNameComparer()); c.CustomProvider(p => new CustomSwaggerProvider(config, p)); }) .EnableSwaggerUi( c => { c.InjectStylesheet(Assembly.GetExecutingAssembly(), "DotNextRZD.PublicApi.Swagger.Styles.SwaggerCustom.css"); }); } } 49
  • 50. 50
  • 51. 51
  • 52. 52
  • 53. 53
  • 54. Источники • http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api • http://www.strathweb.com/2015/10/global-route-prefixes-with-attribute-routing-in-asp-net-web-api/ • https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling • https://jacobian.org/writing/rest-worst-practices/ • http://piwik.org/blog/2008/01/how-to-design-an-api-best-practises-concepts-technical-aspects/ • http://www.toptal.com/api-developers/5-golden-rules-for-designing-a-great-web-api • http://www.odata.org/ • http://owin.org/ • http://pietschsoft.com/post/2014/06/15/cqrs-command-query-responsibility-segregation-design-pattern • https://blog.pivotal.io/pivotal-labs/labs/api-versioning 54
  • 55. Thank you To be continued…

Editor's Notes

  1. Набор правил, как одно приложение или компонет взаимодействует с другими. И механизм, который обеспечивает это взаимодействие Обычно это не про UI Взаимодействие виде Software-to-software (Component)
  2. RPC RPC – это «remote procedure call», понятие очень старое, объединяющие древние, средние и современные протоколы, которые позволяют вызвать метод в другом приложении. XML-RPC – это протокол, появившийся в 1998, вскоре после появления XML. Изначально поддерживался Microsoft, но вскоре Microsoft полностью переключилась на SOAP и поэтому в .Net Framework мы не найдем классов для поддержки этого протокола. Несмотря на это, XML-RPC продолжает жить до сих пор в различных языках (особенно в PHP), видимо, заслужил любовь разработчиков своей простотой. SOAP SOAP также появился в 1998 году стараниями Microsoft. Он был анонсирован как революция в мире ПО. Нельзя сказать, что все пошло по плану Microsoft, было огромное количество критики из-за сложности и тяжеловесности протокола. В то же время были и те, кто считал SOAP настоящим прорывом. Сам же протокол продолжал развиваться и плодиться десятками новых и новых спецификаций, пока в 2003 года W3C не утвердила в качестве рекомендации SOAP 1.2, который и сейчас является последним. Семейство у SOAP получилось внушительное: WS-Addressing, WS-Enumeration, WS-Eventing, WS-Transfer, WS-Trust, WS-Federation, Web Single Sign-On
  3. You do need rest ) «передача состояния представления» – и что? Что это такое? Ничего не понятно. «представление данных в удобном для клиента формате» Рой Филдинг в своей работе 2000го года. Мысль в том, что каждое обращние к сервису переводит клиентское приложение в новое состояние.
  4. Позволяет запускать приложения на любой платформе, поддерживающей OWIN, без изменений.  Спецификация очень проста, это просто Dictionary из параметров и их значений. Базовые параметры определены в спецификации.
  5. После подключения нескольких библиотек через NuGet достаточно такого кода, чтобы наш сервер «взлетел»
  6. После подключения нескольких библиотек через NuGet достаточно такого кода, чтобы наш сервер «взлетел»
  7. После подключения нескольких библиотек через NuGet достаточно такого кода, чтобы наш сервер «взлетел»
  8. После подключения нескольких библиотек через NuGet достаточно такого кода, чтобы наш сервер «взлетел»
  9. После подключения нескольких библиотек через NuGet достаточно такого кода, чтобы наш сервер «взлетел»
  10. После подключения нескольких библиотек через NuGet достаточно такого кода, чтобы наш сервер «взлетел»
  11. После подключения нескольких библиотек через NuGet достаточно такого кода, чтобы наш сервер «взлетел»
  12. После подключения нескольких библиотек через NuGet достаточно такого кода, чтобы наш сервер «взлетел»