2010-10-15 5 views
1

Nous avons une API reposante sur HTTP. Parmi les autres clients, nous avons également des clients d'appareils mobiles (par exemple, iphone). Le problème est qu'il existe plusieurs applications iPhone dans différentes versions (1.0, 2.0). Parce qu'ils sont distribués, nous n'avons aucun contrôle sur la version de l'application qui nous appelle.codage du versionnement des appareils mobiles pour le serveur REST Api

Pour identifier l'application version sur côté serveur je vois les options suivantes:

    dispositif
  1. devez ajouter le paramètre d'URL (par exemple /foo?iphone-app-version=1.0): Un peu dégueu, mais bon chose est que je peux le voir toujours sur server-logs (URL est toujours connecté)
  2. nous authentifions api-clients avec digestion HTTP. Nous pourrions encoder la version de l'application à l'intérieur du nom d'utilisateur (par exemple iphone_1_0): C'est une bonne chose qu'il soit enregistré dans les journaux du serveur, mais ne fonctionne que pour les ressources qui sont exposées en tant que digest HTTP.
  3. Le périphérique doit utiliser un en-tête HTTP personnalisé, par ex. X-IPHONE-APP-VERSION: À mon avis l'approche la plus propre, mais nous ne consignons pas les en-têtes HTTP dans les journaux du serveur (pour le bruit du journal, il est désactivé). Donc, l'analyse plus tard n'est pas possible.

Avez-vous une approche préférée ou d'autres alternatives?

EDIT: Avec les versions précédentes, je ne parle pas d'api-versioning/content-negotiation. C'est la version de l'appareil mobile.

Répondre

0

J'ai décidé de créer un X-xxx-USER-AGENT personnalisé. La raison principale pour décider contre plus standard "User-Agent" est qu'il est déjà "pollué" avec la bibliothèque http-client ou des informations de périphérique mobile. Un X-xxx-USER-AGENT personnalisé est plus facile à analyser pour le serveur et n'interfère pas la bibliothèque http qui le définit souvent et pourrait remplacer une entrée personnalisée.

1

Vous pouvez utiliser Accept-Header pour permettre à un client de déclarer ses capacités en identifiant les versions des types de support qu'il prend en charge. par exemple.

application mobile ne:

GET /server/foo 
Accept: application/vnd.acme.fooappV1+xml 

Lorsque vous introduisez de nouvelles fonctionnalités qui vous ne pouvez pas rétrocompatible dire aux nouveaux clients mis à jour à envoyer,

GET /server/foo 
Accept: application/vnd.acme.fooappV2+xml 

Ensuite, votre serveur connaît les capacités du le client à qui il s'adresse. Vous pouvez également obtenir les nouveaux clients de le faire:

GET /server/foo 
Accept: application/vnd.acme.fooappV1+xml, application/vnd.acme.fooappV2+xml 

De cette façon, vous pouvez migrer vos ressources du serveur vers le nouveau format lentement. Si les points d'extrémité délivrent application/vnd.acme.fooappV1+xml, le client revient à l'ancienne méthode. Si les points de terminaison renvoient application/vnd.acme.fooappV2+xml, le nouveau code peut prendre le relais.

En utilisant cette approche, aucun URI n'a besoin d'être modifié, de sorte que les signets et les statistiques restent valides. La migration vers un nouveau format peut se faire de manière incrémentielle avec le temps et le support pour les anciens clients peut être progressivement éliminé.

+0

il existe déjà un concept de versionnement (à la fois via les en-têtes et perma-link). Ce dont j'ai besoin, c'est d'identifier la version de l'application de l'appareil mobile. Cette version est différente de la version api-server. La motivation est de savoir quelles applications/versions sont utilisées par les utilisateurs finaux. –

+1

@manuel N'est-ce pas ce à quoi sert l'en-tête de l'agent utilisateur? –

+0

oui, cela pourrait tenir (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43).Jusqu'à présent, j'ai seulement vu cet en-tête pour identifier les "constructeurs de connexion" (par exemple, firefox, client http-commons). Je vais jeter un coup d'oeil ce que l'iPhone d'entrée d'utilisateur-agent envoie actuellement. Peut-être que je vais juste ajouter l'app-version-fingerprint (ce serait similaire à l'en-tête X-IPHONE-APP mentionné). L'inconvénient est que je ne peux pas le voir à l'intérieur des journaux de modèle de production car il n'est pas inclus dans permalink. Donc, toutes les statistiques des journaux passés ne fonctionneront pas, seuls les journaux d'en-tête temporairement activés s'afficheront. –

Questions connexes