DG devGiants tech notes

11 décembre 2018

Stratégies de versioning d'API

Cet article présente quelques façons de versionner des APIs.

Contexte

Les APIs sont comme tout autre système programmé : elles évoluent dans le temps, que ce soit avec des correctifs ou des ajouts de fonctionnalités. Il existe une feuille de route qui peut, à terme, conduire à une rupture de compatibilité ascendante afin d’assurer une évolution correcte vis-à-vis des nouvelles fonctionnalités.

Versioning

Le versioning est important, surtout pour donner aux clients de l’API des moyens de s’assurer qu’ils utilisent la bonne version selon leurs besoins.

Quelques façons de faire :

  • Nom de domaine : https://v4.your-api.com
  • Préfixe d’URI : https://your-api.com/api/v4
  • Query string : https://your-api.com/api/?v=4.0.0
  • En-tête HTTP custom : X-API-Version: 4.0.0
  • En-tête HTTP Accept : Accept: application/vendor.app.your-app+json; version=4.0.0

Gardez comme règle générale que changer les URLs est généralement une mauvaise idée. Les en-têtes HTTP sont la bonne approche. Ci-dessous, un exemple de configuration pour l’en-tête Accept.

Configuration FOSRestBundle pour l’en-tête Accept

2 clés sont à ajouter à la configuration de FOSRestBundle : versionning et view:meme_types

Versionning

Il faut dire à FOSRestBundle que vous utilisez le versioning dans votre application :

fos_rest:
  ...
  versioning:
    enabled: true
    resolvers:
      media_type: # Accept header
        enabled: true
        regex: '/(v|version)=(?P<version>[0-9\.]+)/'

Bien sûr, vous pouvez adapter librement la regex à vos besoins.

Ajouter un MIME type

Comme on le voit ci-dessus, le MIME type envoyé est maintenant custom (application/vendor.app.your-app+json; version=4.0.0). Il faut dire à FOSRestBundle de l’accepter :

fos_rest:
  ...
  view:
    ...    
    mime_types:
      json: ['application/json', 'application/json;version=1.0', 'application/json;version=2.0']

Par souci de brièveté, je n’ai mis ici que la clé de configuration correspondant à l’en-tête Accept.