Версионирование API - NurOrNuLL/ESDP-AP-5-6-TEAM-2 GitHub Wiki

Версионирование API

Управление версиями API позволяет изменять поведение между разными клиентами. Платформа REST предоставляет ряд различных схем управления версиями.

Управление версиями определяется входящим запросом клиента и может основываться либо на URL-адресе запроса, либо на основе заголовков запроса.

Существует ряд допустимых подходов к управлению версиями. Неверсионные системы также могут быть подходящими , особенно если вы проектируете системы с очень длительным сроком службы и несколькими клиентами, не зависящими от вас.

Пример приложения с двумя подходами для управления версиями API с помощью django rest framework

Первый подход реализован в alpha приложении django.

При таком подходе API v1 и v2 используют общую модель, но имеют собственные представления и сериализаторы.

Альфа-версия — полностью отдельные представления и сериализаторы для каждой версии API.

Структура приложения

├── api_v1
│   ├── serializers.py
│   ├── urls.py
│   └── views.py
├── api_v2
│   ├── serializers.py
│   ├── urls.py
│   └── views.py
├── apps.py
└── models.py

Второй подход реализован в beta приложении django.

При таком подходе API v1 и v2 используют общую модель и представление, но имеют собственные сериализаторы. SerializerClassMixin Представлен общий вид для обеих версий .

Бета-версия — использование одного и того же набора представлений с разными сериализаторами

Структура приложения

├── api
│   ├── v1
│   │   └── serializers.py
│   ├── v2
│   │   └── serializers.py
│   ├── urls.py
│   └── views.py
├── apps.py
├── mixins.py
└── models.py

В этом случае SerializerClassMixin вводится, поэтому мы можем определить представление следующим образом:

version_map = {
    'v1': BetaSerializer_v1,
    'v2': BetaSerializer_v2,
}

class BetaViewSet(SerializerClassMixin, viewsets.ModelViewSet):
    version_map = version_map
    queryset = Beta.objects.all()

Ключ для version_map должен быть таким же, как у нас в основном urls.py пространстве имен для определенного пути.

Оба подхода можно смешивать даже в одном и том же приложении djanogo.

Составление URL-адресов в основном urls.py

Каждое приложение router показывает, какой из них является drf SimpleRouter.

from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register(r'app', AppViewSet)

Основной urls.py создает экземпляр DefaultRouter и расширяет его с помощью маршрутизаторов приложений.

from rest_framework.routers import DefaultRouter
from alpha.api_v1.urls import router as alpha_v1_router
from alpha.api_v2.urls import router as alpha_v2_router
from beta.api.urls imprt router as beta_router

v1_router = DefaultRouter()
v1_router.registry.extend(alpha_v1_router.registry)
v1_router.registry.extend(beta_router)

v2_router = DefaultRouter()
v2_router.registry.extend(alpha_v2_router.registry)
v2_router.registry.extend(beta_router.registry)

urlpatterns = [
    path('api/v1/', include((v1_router.urls, 'api'), namespace='v1')),
    path('api/v2/', include((v2_router.urls, 'api'), namespace='v2')),
]