SlideShare a Scribd company logo
1 of 69
Download to read offline
Проектирование API
Игорь Кузнецов, Undev, 2013
igkuznetsov@gmail.com, @igkuz
1
пятница, 14 июня 13 г.
План
• Что такое API?
• С чего начать проектирование?
• Какими должны быть формат и структура ответа?
• Валидация больших структур
• Обработка исключений
• Версионирование
• Как написать клиент к вашему API?
• Зачем все это нужно?
2
пятница, 14 июня 13 г.
Что такое API?
3
пятница, 14 июня 13 г.
Что такое API?
Application Programming Interface
3
пятница, 14 июня 13 г.
Что такое API?
Application Programming Interface
Набор методов, предоставляемых приложением(сервисом,
классом, модулем) для использования во внешних программных
продуктах
3
пятница, 14 июня 13 г.
Что такое API на самом деле?
4
пятница, 14 июня 13 г.
Интерфейс должен быть
5
пятница, 14 июня 13 г.
Интерфейс должен быть
• Интуитивно понятным
5
пятница, 14 июня 13 г.
Интерфейс должен быть
• Интуитивно понятным
• Идеально продуманным с самого
начала
5
пятница, 14 июня 13 г.
Интерфейс должен быть
• Интуитивно понятным
• Идеально продуманным с самого
начала
5
пятница, 14 июня 13 г.
С чего начать проектирование?
6
пятница, 14 июня 13 г.
С чего начать проектирование?
6
пятница, 14 июня 13 г.
Просто начать
7
пятница, 14 июня 13 г.
Просто начать
• Отделить API от остальной части проекта
– /api
7
пятница, 14 июня 13 г.
Просто начать
• Отделить API от остальной части проекта
– /api
• rails generate controller api/posts
7
пятница, 14 июня 13 г.
Бездумное следование
8
пятница, 14 июня 13 г.
Бездумное следование
• В книгах и документации:
def	
  index
	
  	
  	
  	
  @people	
  =	
  People.all
	
  
	
  	
  	
  	
  respond_to	
  do	
  |format|
	
  	
  	
  	
  	
  	
  format.html
	
  	
  	
  	
  	
  	
  format.xml	
  {	
  render	
  xml:	
  @people.to_xml	
  }
	
  	
  	
  	
  end
	
  	
  end
8
пятница, 14 июня 13 г.
Приводит к проблемам
	
  if	
  @category.save
	
  	
  	
  	
  	
  	
  respond_to	
  do	
  |format|
	
  	
  	
  	
  	
  	
  	
  	
  format.html	
  do
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  flash[:notice]	
  =	
  l(:notice_successful_create)
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  redirect_to_settings_in_projects
	
  	
  	
  	
  	
  	
  	
  	
  end
	
  	
  	
  	
  	
  	
  	
  	
  format.js
	
  	
  	
  	
  	
  	
  	
  	
  format.api	
  {	
  render	
  :action	
  =>	
  'show',	
  :status	
  =>	
  :created	
  }
	
  	
  	
  	
  	
  	
  end
	
  	
  	
  	
  else
	
  	
  	
  	
  	
  	
  respond_to	
  do	
  |format|
	
  	
  	
  	
  	
  	
  	
  	
  format.html	
  {	
  render	
  :action	
  =>	
  'new'}
	
  	
  	
  	
  	
  	
  	
  	
  format.js	
  	
  	
  {	
  render	
  :action	
  =>	
  'new'}
	
  	
  	
  	
  	
  	
  	
  	
  format.api	
  {	
  render_validation_errors(@category)	
  }
	
  	
  	
  	
  	
  	
  end
	
  	
  	
  	
  end
9
пятница, 14 июня 13 г.
Правильный путь
10
пятница, 14 июня 13 г.
Правильный путь
10
• respond_with + ( jbuilder || RABL || Action Model Serializers)
пятница, 14 июня 13 г.
Правильный путь
10
• respond_with + ( jbuilder || RABL || Action Model Serializers)
• структура и формат определяются во view или отдельном
объекте
пятница, 14 июня 13 г.
Возможный ответ
11
GitHub Instagram Foursquare
пятница, 14 июня 13 г.
Возможный ответ
12
GitHub Instagram Foursquare
пятница, 14 июня 13 г.
Что взять?
13
Foursquare + Instagram
json.meta	
  do	
  |json|
	
  	
  json.total	
  	
  	
  	
  	
  	
  	
  	
  @lists.total_count
	
  	
  json.num_pages	
  	
  	
  	
  @lists.num_pages
	
  	
  json.per_page	
  	
  	
  	
  	
  @per_page	
  	
  
end
	
  
json.items	
  @lists	
  do	
  |json,	
  list|
	
  	
  json.partial!	
  "maillist",	
  maillist:	
  list
end
пятница, 14 июня 13 г.
Сложные структуры в ответе
14
пятница, 14 июня 13 г.
Сложные структуры в ответе
14
	
  	
  #	
  @return	
  [Hash]	
  Updated	
  subscriber	
  object
	
  	
  #	
  	
  	
  @example
	
  	
  #	
  	
  	
  	
  	
  {
	
  	
  #	
  	
  	
  	
  	
  	
  	
  "id":	
  1,
	
  	
  #	
  	
  	
  	
  	
  	
  	
  "email":	
  "123@example.com",
	
  	
  #	
  	
  	
  	
  	
  	
  	
  "first_name":	
  "Name#1",
	
  	
  #	
  	
  	
  	
  	
  	
  	
  "last_name":	
  "Name#2",
	
  	
  #	
  	
  	
  	
  	
  	
  	
  "organization":	
  "Organization#1",
	
  	
  #	
  	
  	
  	
  	
  	
  	
  "accreditation":	
  "Accreditation#1",
	
  	
  #	
  	
  	
  	
  	
  	
  	
  "unisender_state":	
  "unprocessed",
	
  	
  #	
  	
  	
  	
  	
  	
  	
  "highrise_state":	
  "unprocessed"
	
  	
  #	
  	
  	
  	
  	
  }
	
  	
  def	
  update_subscriber
	
  	
  	
  	
  #	
  some	
  code
	
  	
  end
пятница, 14 июня 13 г.
15
JSON Schema
пятница, 14 июня 13 г.
15
	
  	
  	
  	
  "$schema":	
  "http://json-­‐schema.org/draft-­‐04/schema#",
	
  	
  	
  	
  "title":	
  "List",
	
  	
  	
  	
  "type":	
  "object",
	
  	
  	
  	
  "required":	
  ["id",	
  "name	
  "],
	
  	
  	
  	
  "properties":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "id":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "description":	
  "Lists	
  unique	
  identifier",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "type":	
  "integer"
	
  	
  	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  	
  	
  "name":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "description":	
  "Lists	
  name	
  in	
  project",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "type":	
  "string"
	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  }
JSON Schema
пятница, 14 июня 13 г.
16
В результате
пятница, 14 июня 13 г.
16
В результате
	
  	
  #	
  @return	
  [Hash]	
  Updated	
  subscriber	
  object
	
  	
  #	
  	
  	
  @example
	
  	
  #	
  	
  	
  Link:	
  http://yoursite.com/your_schema.json
	
  	
  def	
  update_subscriber
	
  	
  	
  	
  #	
  some	
  code
	
  	
  end
• Gem: json-schema
• https://github.com/hoxworth/json-schema
пятница, 14 июня 13 г.
Пагинация
17
пятница, 14 июня 13 г.
Пагинация
17
• Kaminari
• https://github.com/amatsuda/kaminari
def	
  index
	
  	
  	
  	
  @lists	
  =	
  List.active.
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  page(params[:page]).per(params[:per])
	
  	
  	
  	
  respond_with	
  @lists
	
  	
  end
пятница, 14 июня 13 г.
Выборка, сортировка
18
пятница, 14 июня 13 г.
Выборка, сортировка
18
• Ransack
• https://github.com/ernie/ransack
	
  	
  def	
  index
	
  	
  	
  	
  @search	
  =	
  List.ransack(params[:search])
	
  	
  	
  	
  @lists	
  =	
  @search.result.page(params[:page])
	
  	
  
	
  	
  	
  	
  respond_with	
  @lists
	
  	
  end
пятница, 14 июня 13 г.
Обработка ошибок
19
пятница, 14 июня 13 г.
Обработка ошибок
19
• Одно из самых важных мест в API
пятница, 14 июня 13 г.
Обработка ошибок
19
• Одно из самых важных мест в API
• Отдавать правильные статус коды
пятница, 14 июня 13 г.
Обработка ошибок
19
• Одно из самых важных мест в API
• Отдавать правильные статус коды
• Присылать человеческие описания ошибок
пятница, 14 июня 13 г.
Обработка ошибок
19
• Одно из самых важных мест в API
• Отдавать правильные статус коды
• Присылать человеческие описания ошибок
пятница, 14 июня 13 г.
Состояние API
20
пятница, 14 июня 13 г.
Состояние API
20
• Все хорошо - success(200)
пятница, 14 июня 13 г.
Состояние API
20
• Все хорошо - success(200)
• Клиент прислал что-то не то - client error (400)
пятница, 14 июня 13 г.
Состояние API
20
• Все хорошо - success(200)
• Клиент прислал что-то не то - client error (400)
• Сервер сделал что-то не то - server error (500)
пятница, 14 июня 13 г.
Варианты
21
пятница, 14 июня 13 г.
Варианты
21
• 8-10 статус кодов на все случаи жизни
пятница, 14 июня 13 г.
Варианты
21
• 8-10 статус кодов на все случаи жизни
• Улыбаемся и машем
пятница, 14 июня 13 г.
Примеры старших
22
• Facebook:
HTTP Status Code: 200
{"type" : "OauthException", "message":"(#803) Some
of the aliases you requested do not exist: foo.bar"}
• Github:
HTTP/1.1 404 Not Found
{"message": "Not Found"}
пятница, 14 июня 13 г.
Exceptions App
23
пятница, 14 июня 13 г.
Exceptions App
23
• application.rb:
– config.exceptions_app = self.routes
пятница, 14 июня 13 г.
Exceptions App
23
• application.rb:
– config.exceptions_app = self.routes
• routes.rb:
– match	
  '/404',	
  :to	
  =>	
  "errors#not_found"
– match	
  '/422',	
  :to	
  =>	
  "errors#unprocessable_entity"
– match	
  '/500',	
  :to	
  =>	
  "errors#internal_error"
пятница, 14 июня 13 г.
Exceptions App
24
class	
  ErrorsController	
  <	
  ApplicationController
	
  	
  	
  	
  	
  	
  respond_to	
  :json,	
  :html
	
  
	
  	
  	
  	
  	
  	
  def	
  not_found
	
  	
  	
  	
  	
  	
  	
  	
  #	
  some	
  code	
  here
	
  	
  	
  	
  	
  	
  end
	
  	
  	
  	
  	
  	
  def	
  internal_error
	
  	
  	
  	
  	
  	
  	
  	
  respond_with(...)
	
  	
  	
  	
  	
  	
  end
	
  	
  	
  	
  	
  	
  def	
  unprocessable_entity
	
  	
  	
  	
  	
  	
  	
  	
  #	
  some	
  code	
  here
	
  	
  	
  	
  	
  	
  end
	
  	
  	
  	
  end
пятница, 14 июня 13 г.
Версионирование
25
пятница, 14 июня 13 г.
Версионирование
25
• У API обязана быть версия
пятница, 14 июня 13 г.
Версионирование
25
• У API обязана быть версия
• Headers vs Urls
пятница, 14 июня 13 г.
Версионирование
25
• У API обязана быть версия
• Headers vs Urls
• Url:
– http://exmaple.com/v1/users?access_token=...
пятница, 14 июня 13 г.
Версионирование
25
• У API обязана быть версия
• Headers vs Urls
• Url:
– http://exmaple.com/v1/users?access_token=...
• Headers:
– X-Example-Api-Version: 1.2
пятница, 14 июня 13 г.
Сколько версий поддерживать
26
пятница, 14 июня 13 г.
Сколько версий поддерживать
26
• Минимум 1 версию назад
пятница, 14 июня 13 г.
Сколько версий поддерживать
26
• Минимум 1 версию назад
• Зависит от бизнес требований
пятница, 14 июня 13 г.
Best practices || Тест на адекватность
27
пятница, 14 июня 13 г.
Best practices || Тест на адекватность
27
• Библиотека для работы с API
пятница, 14 июня 13 г.
Best practices || Тест на адекватность
27
• Библиотека для работы с API
• Если вам сложно написать клиент для вашего API, стоит
серьезно задуматься
пятница, 14 июня 13 г.
API Client
28
пятница, 14 июня 13 г.
API Client
28
• Weary
• https://github.com/mwunsch/weary
class	
  MyClass	
  <	
  Weary::Client
	
  	
  	
  	
  get	
  :resource,	
  "http://host.com/path/to/"	
  do	
  |resource|
	
  	
  	
  	
  	
  	
  resource.required	
  :api_token,	
  :id
	
  	
  	
  	
  	
  	
  resource.optional	
  :optional_parameter
	
  	
  	
  	
  end
	
  	
  end
пятница, 14 июня 13 г.
Зачем нужно делать хорошее API?
29
пятница, 14 июня 13 г.
Зачем нужно делать хорошее API?
29
• Залог успешного общения с вашими пользователями
пятница, 14 июня 13 г.
Зачем нужно делать хорошее API?
29
• Залог успешного общения с вашими пользователями
• Неявное вложение в рекламу
пятница, 14 июня 13 г.
Зачем нужно делать хорошее API?
29
• Залог успешного общения с вашими пользователями
• Неявное вложение в рекламу
• Вложение в будущее проекта
пятница, 14 июня 13 г.
Вопросы?
30
пятница, 14 июня 13 г.

More Related Content

Viewers also liked

Choosing A Career And Major
Choosing A Career And MajorChoosing A Career And Major
Choosing A Career And Majortjules77
 
Sistema operativo p.
Sistema operativo p.Sistema operativo p.
Sistema operativo p.locosjjsena
 
перезентация здоровый ребенок
перезентация здоровый ребенокперезентация здоровый ребенок
перезентация здоровый ребенокKonstantin Boldyrev
 
Vvodnyi vebinar po unikalnosty 21 janv 2012
Vvodnyi vebinar po unikalnosty 21 janv 2012Vvodnyi vebinar po unikalnosty 21 janv 2012
Vvodnyi vebinar po unikalnosty 21 janv 2012Konstantin Boldyrev
 
Sacre coeur in montmartre
Sacre coeur in montmartreSacre coeur in montmartre
Sacre coeur in montmartreblomanno
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationMikhail Shcherbakov
 
энтони чаплин Naturest ram сон
энтони чаплин Naturest ram сонэнтони чаплин Naturest ram сон
энтони чаплин Naturest ram сонKonstantin Boldyrev
 
Oсобенности тестирования игр
Oсобенности тестирования игрOсобенности тестирования игр
Oсобенности тестирования игрqasib
 

Viewers also liked (10)

The ideal business_compacted 1
The ideal business_compacted 1The ideal business_compacted 1
The ideal business_compacted 1
 
Choosing A Career And Major
Choosing A Career And MajorChoosing A Career And Major
Choosing A Career And Major
 
Sistema operativo p.
Sistema operativo p.Sistema operativo p.
Sistema operativo p.
 
Look's que arrasam!
Look's que arrasam!Look's que arrasam!
Look's que arrasam!
 
перезентация здоровый ребенок
перезентация здоровый ребенокперезентация здоровый ребенок
перезентация здоровый ребенок
 
Vvodnyi vebinar po unikalnosty 21 janv 2012
Vvodnyi vebinar po unikalnosty 21 janv 2012Vvodnyi vebinar po unikalnosty 21 janv 2012
Vvodnyi vebinar po unikalnosty 21 janv 2012
 
Sacre coeur in montmartre
Sacre coeur in montmartreSacre coeur in montmartre
Sacre coeur in montmartre
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
 
энтони чаплин Naturest ram сон
энтони чаплин Naturest ram сонэнтони чаплин Naturest ram сон
энтони чаплин Naturest ram сон
 
Oсобенности тестирования игр
Oсобенности тестирования игрOсобенности тестирования игр
Oсобенности тестирования игр
 

Similar to Api devconf 2013

Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на RailsAndrei Kaleshka
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo
 
Postman тестирование api v1.0 (1)
Postman тестирование api v1.0 (1)Postman тестирование api v1.0 (1)
Postman тестирование api v1.0 (1)DataArt
 
Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)Ontico
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
 
Антон Тюрин — Облачная платформа Cocaine — облако своими руками
Антон Тюрин — Облачная платформа Cocaine — облако своими рукамиАнтон Тюрин — Облачная платформа Cocaine — облако своими руками
Антон Тюрин — Облачная платформа Cocaine — облако своими рукамиYandex
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo
 
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&CoMaking of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Coit-people
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)AvitoTech
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Yulia Tsisyk
 
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»Mail.ru Group
 
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...JSFestUA
 
Компонент-платформа / Александр Лобашев (Avito)
Компонент-платформа / Александр Лобашев (Avito) Компонент-платформа / Александр Лобашев (Avito)
Компонент-платформа / Александр Лобашев (Avito) Ontico
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Автотестирование веб-сервиса с Ruby и Rspec
Автотестирование веб-сервиса с Ruby и RspecАвтотестирование веб-сервиса с Ruby и Rspec
Автотестирование веб-сервиса с Ruby и RspecSQALab
 

Similar to Api devconf 2013 (20)

Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
 
Postman тестирование api v1.0 (1)
Postman тестирование api v1.0 (1)Postman тестирование api v1.0 (1)
Postman тестирование api v1.0 (1)
 
Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
Антон Тюрин — Облачная платформа Cocaine — облако своими руками
Антон Тюрин — Облачная платформа Cocaine — облако своими рукамиАнтон Тюрин — Облачная платформа Cocaine — облако своими руками
Антон Тюрин — Облачная платформа Cocaine — облако своими руками
 
python vs ruby
python vs rubypython vs ruby
python vs ruby
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
 
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&CoMaking of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
 
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
 
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
 
JavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программированияJavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программирования
 
Компонент-платформа / Александр Лобашев (Avito)
Компонент-платформа / Александр Лобашев (Avito) Компонент-платформа / Александр Лобашев (Avito)
Компонент-платформа / Александр Лобашев (Avito)
 
Design Platform FrontendConf
Design Platform FrontendConfDesign Platform FrontendConf
Design Platform FrontendConf
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Perl – жив?!
Perl – жив?!Perl – жив?!
Perl – жив?!
 
Автотестирование веб-сервиса с Ruby и Rspec
Автотестирование веб-сервиса с Ruby и RspecАвтотестирование веб-сервиса с Ruby и Rspec
Автотестирование веб-сервиса с Ruby и Rspec
 

Api devconf 2013