115 votes

Format de date recommandé pour une API REST GET

Quel est le format de timestamp recommandé pour une API REST GET comme celle-ci :

http://api.example.com/start_date/{timestamp}

Je pense que le format de date actuel devrait être le format ISO 8601, tel que YYYY-MM-DDThh:mm:ssZ pour l'heure UTC.

Devrions-nous utiliser la version ISO 8601 sans tirets et deux-points, comme :

http://api.example.com/start_date/YYYYMMDDThhmmssZ

ou devrions-nous encoder le format ISO 8601, en utilisant par exemple un encodage base64 ?

0 votes

Pourquoi le format ISO 8601 tel quel n'est-il pas une option pour vous?

0 votes

@Johannes le format ISO 8601 (dans la version sans tirets et deux-points) serait acceptable, je me demandais juste s'il existe un type d'approche recommandée pour représenter des dates dans les URL

114voto

mohamed-stark Points 617

Vérifiez cet article pour les 5 lois des dates et heures des API ICI:

  • Loi n°1 : Utilisez l'ISO-8601 pour vos dates
  • Loi n°2 : Acceptez n'importe quel fuseau horaire
  • Loi n°3 : Stockez-le en UTC
  • Loi n°4 : Renvoyez-le en UTC
  • Loi n°5 : Ne pas utiliser l'heure si vous n'en avez pas besoin

Plus d'informations dans la documentation.

3 votes

-1, comme 2017-11-20T11%3A00%3A00Z n'est tout simplement pas très lisible. De plus (spécifique à IIS), il semble être très paranoïaque concernant les deux-points dans les URL même si ils sont encodés.

3 votes

Ce lien - agiletribe.wordpress.com/2015/06/10/jsonrest-api-handling-da‌​tes recommande l'époque entière pour éviter les problèmes de lisibilité humaine qui pourraient être rencontrés avec le format ISO-8601. Faites-moi savoir si vous avez un point de vue différent.

5 votes

Notez que les tirets et les points ne sont pas des caractères réservés dans les URL. Seuls les deux-points nécessitent un encodage d'URL (fr.wikipedia.org/wiki/Adresse_absolue). Dans l'ISO-8601 (fr.wikipedia.org/wiki/ISO_8601), les tirets sont obligatoires mais les deux-points sont optionnels. Ainsi, les variantes correctes de l'ISO-8601 à utiliser dans les URL sont YYYY-MM-DDThhmmssZ et YYYY-MM-DDThhmmss.mmmZ si vous avez besoin d'une plus grande précision.

81voto

nategood Points 3753

REST n'a pas de format de date recommandé. En réalité, cela dépend de ce qui fonctionne le mieux pour votre utilisateur final et votre système. Personnellement, je préférerais m'en tenir à une norme comme celle de l'ISO 8601 (encodée en URL).

Si ne pas avoir une URI laide est une préoccupation (par exemple, ne pas inclure la version encodée en URL de :, -, dans votre URI) et que l'adressabilité (humaine) n'est pas aussi importante, vous pourriez également envisager l'heure epoch (par exemple, http://example.com/start/1331162374). L'URL semble un peu plus propre, mais vous perdez certainement en lisibilité.

Le /2012/03/07 est un autre format que l'on voit souvent. Vous pourriez l'élargir, je suppose. Si vous décidez d'adopter cette approche, assurez-vous d'être toujours en temps GMT (et précisez-le dans votre documentation) ou vous voudrez peut-être également inclure un indicateur de fuseau horaire.

En fin de compte, cela dépend de ce qui fonctionne pour votre API et votre utilisateur final. Votre API devrait fonctionner pour vous, et non l'inverse ;-).

13 votes

Merci, réponse très utile. Je pense que je vais opter pour la version compressée de l'ISO 8601 (c'est-à-dire http://api.example.com/start_date/YYYYMMDDThhmmssZ) qui est bonne pour la lisibilité et des URLs propres.

8 votes

Mais le JSON possède un format de date recommandé qui est l'ISO 8601 :)

0 votes

@stalemate Les objets Date par défaut se sérialisent sous forme de chaîne de caractères contenant la date au format ISO. developer.mozilla.org/en-US/docs/JSON

22voto

Mithun Points 9971

Chaque champ datetime en entrée/sortie doit être au format UNIX/epoch. Cela évite la confusion entre les développeurs des différentes parties de l'API.

Avantages :

  • Le format Epoch n'a pas de fuseau horaire.
  • L'Epoch a un seul format (le temps Unix est un nombre signé unique).
  • Le temps Epoch n'est pas affecté par le passage à l'heure d'été.
  • La plupart des frameworks Backend et toutes les API native ios/android prennent en charge la conversion en epoch.
  • La conversion en heure locale peut être entièrement réalisée du côté de l'application en fonction du paramétrage de fuseau horaire de l'appareil/navigateur de l'utilisateur.

Inconvénients :

  • Traitement supplémentaire pour la conversion en UTC afin de stocker au format UTC dans la base de données.
  • Lisibilité de l'entrée/sortie.
  • Lisibilité des URLs GET.

Notes :

  • Les fuseaux horaires sont un problème de couche de présentation ! La plupart de votre code ne devrait pas manipuler les fuseaux horaires ou l'heure locale, il devrait simplement transmettre l'heure Unix.
  • Si vous souhaitez stocker une heure lisible par les humains (par exemple des journaux), envisagez de le faire en parallèle avec le temps Unix, et non à la place du temps Unix.

1 votes

Je ne pourrais pas être plus d'accord.

2 votes

La seule chose que j'ajouterais à cela est de considérer dès le début si vous devrez prendre en compte les millisecondes dans votre système. Si c'est le cas, utilisez la version milliseconde du timestamp Unix.

19voto

LIUFA Points 3642

RFC6690 - Formats de liens Constrained RESTful Environments (CoRE) ne précise pas explicitement le format de date à utiliser, cependant dans la section 2. Format de lien, il renvoie au RFC 3986. Cela implique que la recommandation pour le type de date dans le RFC 3986 devrait être utilisée.

Essentiellement, RFC 3339 Date et heure sur Internet est le document à consulter qui dit :

format de date et heure à utiliser dans les protocoles Internet qui est un profil de la norme ISO 8601 pour la représentation des dates et heures utilisant le calendrier grégorien.

ce qui se résume ainsi : YYYY-MM-ddTHH:mm:ss.ss±hh:mm

(par exemple 1937-01-01T12:00:27.87+00:20)

est le choix le plus sûr.

2voto

Michael K Points 21

Toujours utiliser UTC :

Par exemple, j'ai un composant d'horaire qui prend un paramètre DATETIME. Lorsque j'appelle ceci en utilisant un verbe GET, j'utilise le format suivant où mon nom de paramètre entrant est scheduleDate.

Exemple:
https://localhost/api/getScheduleForDate?scheduleDate=2003-11-21T01:11:11Z

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X