Содержание
- + Методалогии разработки ПО
-
–
Проектирование систем
- – API
- + UML
- + Интеграции
- + Моделирование данных
- + Представление данных
- BPMN
- C4 model
- Domain Driven Design
- EPC
- IDEF0
- Архитектор
- Архитектура
- Интерфейс
- Карта экосистемы
- Когда стоит выбирать микросервисы
- Контекстная диаграмма
- Ролевая модель
- Проектирование систем
- + Развёртывание
-
+
Разработка
- + Git
- + Linux OS
- + Mac OS
- + Подходы организации кода
- + Языки программирования
- Виды программирования
- Интерпритатор
- Компилятор
- Разработка
-
+
Сеть
- + OSI
- + Защита
- CDN
- ngrok
- Сеть
- + Системный анализ
- + Требования
- + Хранение данных
- + Языки разметки
Подход №1: URL
Добавление номера версии в URL является очень распространенной практикой среди популярных публичных API.
По сути, вы просто добавляете v1
или 1
в URL, потому указать следующую версию не составит труда.
https://api.example.com/v1/places`
GET https://api.example.com/users/v1/users
/v1/users
Однажды вы получаете email от example.com
, в котором говорится, что их API v1 через три месяца больше не будет поддерживаться
Плюсы
-
Невероятно прост для API разработчиков
-
Невероятно прост для API пользователей
-
Удобные для URLы для копипаста
Минусы
-
Технически не является RESTful
-
Сложен при размещении на отдельные сервера
-
Принуждает пользователей API прибегать к сложным и непонятным действиям для поддержания ссылок (links) в актуальном состоянии.
Подход №2: Имя хоста
Некоторые разработчики API в попытке избежать проблем с установкой сервера, где указывается версия в URI, просто указывают номер версии в имени хоста (или поддомена).
https://api-v1.example.com/places
Плюсы
-
Невероятно прост для API разработчиков
-
Невероятно прост для API пользователей
-
Удобные для URLы для копипаста
-
Простое использование DNS для распределения версий на несколько серверов.
Минусы
-
Технически не является RESTful
-
Принуждает пользователей API прибегать к сложным и непонятным действиям для поддержания ссылок (links) в актуальном состоянии.
Подход №3.1: Тело и параметры запроса
Если вы решили уйти от размещения версии в URI, тогда одно из двух других мест, где её можно указать, это само тело HTTP запроса.
POST /places HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"version": "1.0"
}
Некоторые предполагают, что решение этой проблемы в том, чтобы перемести параметр версии в строку запроса, но тогда версия снова попадает в URL! И тогда сразу многие проблемы первых двух подходов возвращаются.
POST /places?version=1.0 HTTP/1.1
Host: api.example.com
header1,header2
value1,value2
Популярные API
-
Netflix
-
Google Data
-
PayPal
-
Amazon SQS
Плюсы
-
Прост для API разработчиков
-
Прост для API пользователей
-
URL остается таким же, когда параметр внутри тела запроса
-
Технически это больше похоже на RESTful, чем указывание версии в URI
Минусы
-
Различные виды
Content-type
требуют различные параметры и для некоторых (например CSV) такой вариант просто не подходит. -
Принуждает пользователей API прибегать к сложным и непонятным действиям для поддержания ссылок (links) в актуальном состоянии, если параметр версии находится в строке запроса
-
незя GET выполнить
Подход №3.2: Кастомный заголовок запроса
Итак, если URL или тело HTTP запроса не очень подходящее место для размещения информации о версии API, то что остается? Конечно, это заголовки!
GET /places HTTP/1.1
Host: api.example.com
BadApiVersion: 1.0
Это плохо и не правильно по многом причинам. Почему?
Первое, потому что ответ сервера зависит от версии в заголовке запроса, и это означает, что ответ на самом деле должен быть таким:
HTTP/1.1 200 OK
BadAPIVersion: 1.1
Vary: BadAPIVersion
С другой стороны, промежуточные кеши могут отдать клиентам неверный ответ. (например, ответ 1.2 на клиент 1.1 или наоборот)
Без указания заголовка Vary
, возникают трудности с системами кеширования, например Varnish не сможет понять, что кто-то запрашивает версию 1.0, потому что URL не сильно отличается от запроса версий 1.1 или 2.0. Это может стать большой проблемой, поскольку пользователи API запрашивают конкретную версию, а не какую-то другую.
Плюсы
-
Прост для пользователей API (если они знают про заголовки)
-
URL остается таким же
-
Технически это больше похоже на RESTful, чем указывание версии в URI
Минусы
-
Системы кеширования могут запутаться
-
Разработчики API могут запутаться (если они не знают про заголовки)
-
для клиентов - плохой вариант
Подход №4: Распределение контента
Заголовок Accept
спроектирован для того, чтобы попросить сервер выдать ответ для определенного ресурса в определенном формате. Традиционно, многие разработчики задумываются о нем только в случае (X)HTML, JSON
GitHub до сих пор следует советам многих людей, упомянутых в этой главе, и используют заголовок Accept
для отдачи различных типов данных.
Все типы данных GitHub выглядят примерно так:
application/vnd.github[.version].param[+json]
Самые базовые типы, которые поддерживает API:
application/json
application/vnd.github+json
Такой подход решает проблему кеширования, решает проблемы манипуляций с URL как у подходов с указанием версионности в URL, и его можно считать более RESTful, но для некоторых разработчиков может показаться довольно запутанным.
Популярные API
- GitHub
Плюсы
-
Прост для пользователей API (если они знают про заголовки)
-
URL остается таким же
-
HATEOAS-совместимый
-
Кеш-совместимый
-
Sturgeon-approved (нуу.. наверно "осетр одобряе")
Минусы
-
Разработчики API могут запутаться (если они не знают про заголовки)
-
Версионирование целиком всего API может запутать пользователей (но и все другие походы имеют туже проблему)
-
клиентские тоже не будут работать