Это хороший и сложный вопрос. Тема разработки URI в то же время является наиболее важной частью REST API и , следовательно, потенциально долгосрочным обязательством по отношению к пользователям этого API .
Поскольку эволюция приложения и, в меньшей степени, его API - это факт жизни, и он даже похож на эволюцию, казалось бы, сложного продукта, такого как язык программирования, дизайн URI должен иметь менее естественные ограничения и должен быть сохранен. в течение долгого времени . Чем дольше срок службы приложения и API, тем больше приверженность пользователям приложения и API.
С другой стороны, еще один факт из жизни состоит в том, что трудно предвидеть все ресурсы и их аспекты, которые будут потребляться через API. К счастью, нет необходимости разрабатывать весь API, который будет использоваться до Апокалипсиса . Достаточно правильно определить все конечные точки ресурса и схему адресации каждого ресурса и экземпляра ресурса.
Со временем вам может понадобиться добавить новые ресурсы и новые атрибуты к каждому конкретному ресурсу, но метод, которым пользователи API следуют для доступа к конкретным ресурсам, не должен изменяться, как только схема адресации ресурсов становится общедоступной и, следовательно, окончательной.
Этот метод применяется к семантике глаголов HTTP (например, PUT должен всегда обновляться / заменяться) и к кодам состояния HTTP, которые поддерживаются в более ранних версиях API (они должны продолжать работать, чтобы клиенты API, работавшие без вмешательства человека, могли продолжать работать как это).
Кроме того, поскольку встраивание версии API в URI нарушило бы концепцию гипермедиа как движка состояния приложения (о чем говорится в диссертации доктора Roy T. Fieldings) из-за наличия адреса ресурса / URI, который будет меняться со временем, я пришел бы к выводу, что API версии не должны храниться в URI ресурса в течение длительного времени, а это означает, что URI ресурса, от которого могут зависеть пользователи API, должны быть постоянными .
Конечно, есть возможность встроить версию API в базовый URI, но только для разумного и ограниченного использования, такого как отладка клиента API, который работает с новой версией API. Такие версии API должны быть ограничены по времени и доступны только для ограниченных групп пользователей API (например, во время закрытых бета-версий). В противном случае вы берете на себя обязательство там, где не должны.
Несколько мыслей по поводу поддержки версий API, у которых есть срок годности. Все платформы / языки программирования, обычно используемые для реализации веб-сервисов (Java, .NET, PHP, Perl, Rails и т. Д.), Позволяют легко привязывать конечные точки веб-сервиса к базовому URI. Таким образом, можно легко собирать и хранить коллекцию файлов / классов / методов в разных версиях API .
От POV пользователей API также легче работать и связываться с конкретной версией API, когда это очевидно, но только в течение ограниченного времени, то есть во время разработки.
Из POV сопровождающего API проще поддерживать разные версии API параллельно, используя системы контроля версий, которые преимущественно работают с файлами как наименьшей единицей управления версиями (исходного кода).
Однако с версиями API, четко видимыми в URI, есть предостережение: можно также возразить против этого подхода, поскольку история API становится видимой / видимой в структуре URI и, следовательно, подвержена изменениям со временем, что противоречит рекомендациям REST. Согласен!
Способ обойти это разумное возражение состоит в том, чтобы реализовать последнюю версию API в базовом URI API без версии. В этом случае разработчики клиента API могут выбрать:
разрабатывать против самой последней (взяв на себя обязательство поддерживать приложение, защищая его от возможных изменений API, которые могут сломать их плохо спроектированный клиент API ).
привязка к определенной версии API (которая становится очевидной), но только в течение ограниченного времени
Например, если API v3.0 является последней версией API, следующие два должны быть псевдонимами (т.е. вести себя одинаково для всех запросов API):
http: // shonzilla / api / Customers / 1234
http: // shonzilla / api /v3.0 / Customers / 1234
http: // shonzilla / api / v3 / Customers / 1234
Кроме того, клиенты API, которые все еще пытаются указать на старый API, должны быть проинформированы об использовании последней предыдущей версии API, если используемая версия API устарела или больше не поддерживается . Таким образом, доступ к любому из устаревших URI, как эти:
http: // shonzilla / api /v2.2 / Customers / 1234
http: // shonzilla / api /v2.0 / Customers / 1234
http: // shonzilla / api / v2 / Customers / 1234
http: // shonzilla / api /v1.1 / Customers / 1234
http: // shonzilla / api / v1 / Customers / 1234
должен вернуть любой из 30x кодов состояния HTTP, которые указывают перенаправление , которые используются в сочетании с Location
заголовком HTTP, который перенаправляет к соответствующей версии URI ресурса, который остается этим:
Http: // shonzilla / API / клиенты / 1234
Существует как минимум два кода состояния перенаправления HTTP, которые подходят для сценариев управления версиями API:
301 Перемещено навсегда, указывая на то, что ресурс с запрошенным URI навсегда перемещен в другой URI (который должен быть постоянной ссылкой на экземпляр ресурса, который не содержит информацию о версии API). Этот код состояния может использоваться для указания устаревшей / неподдерживаемой версии API, сообщая клиенту API, что версионный URI ресурса был заменен на постоянную ссылку ресурса .
302 Found указывает, что запрошенный ресурс временно находится в другом месте, хотя запрошенный URI все еще может поддерживаться. Этот код состояния может быть полезен, когда URI без версии временно недоступны и запрос должен повторяться с использованием адреса перенаправления (например, указание на URI со встроенной версией APi), и мы хотим сказать клиентам, чтобы они продолжали его использовать (т.е. Permalinks).
другие сценарии можно найти в главе Redirection 3xx спецификации HTTP 1.1