Une API REST doit-elle être capable de convertir datetime en fuseau horaire de clients appropriés?

10

Lors de la mise en œuvre de notre API, le problème de l'heure et des fuseaux horaires s'est posé.

Toutes les dates sont normalisées en UTC dans la base de données. Actuellement, dans l'application non-API, tous les horaires sont convertis en fonction des préférences des utilisateurs avant d'être présentés.

Maintenant, la même question s'est posée pour l'API: l'API devrait-elle être en mesure de renvoyer le datetime approprié pour un fuseau horaire basé sur la sémantique des demandes?

Par exemple GET /posts?timezone=America/Sao_Paulo?

Ou doit-il toujours être fait sur n'importe quel client accédant à l'API?

Mise à jour: depuis qu'elle est apparue plusieurs fois: actuellement les horodatages avec fuseau horaire sont retournés (bien que ce soit toujours le décalage TZ +00:00). Le format est le 8601 populaire:2015-10-29T23:00:49+00:00

marque
la source
Si vous renvoyez un horodatage contenant un fuseau horaire, le client peut facilement le convertir à l'heure locale nécessaire. Quoi qu'il en soit, cette question ne semble pas du tout liée à REST. Il existe de nombreuses façons d'implémenter cela qui ne violent pas les principes de REST. Veuillez noter que l'exposition de ce paramètre signifie plus de travail pour vous. Dans une architecture véritablement RESTful, vous devrez rendre ces liens découvrables d'une manière ou d'une autre. Cela me semble être une chose inutilement compliquée à implémenter à la fois côté client et côté serveur.
toniedzwiedz
> Cela me semble une chose inutilement compliquée à implémenter à la fois côté client et côté serveur. Merci pour la contribution!
marquez

Réponses:

17

Vous devez renvoyer un point absolu dans le temps, puis n'importe qui peut localiser cet horodatage au besoin. Par "horodatage absolu", j'entends un horodatage UNIX ou un horodatage lisible par l'homme qui inclut le fuseau horaire dans l'un des formats ISO normalisés, par exemple "2007-04-05T14: 30Z". Cela peut être trivialement converti en fuseau horaire local par le client si nécessaire.

Si vous souhaitez accepter un paramètre de fuseau horaire et localiser l'horodatage sur ce fuseau horaire, c'est bien, mais vous devez toujours utiliser l'horodatage absolu incl. fuseau horaire dans votre réponse, par exemple "2007-04-05T16: 30-02: 00". Étant donné que cette valeur est identique à la précédente non localisée, il est assez discutable pourquoi vous auriez du mal à offrir ce paramètre. Le format d'affichage exact de l'horodatage dépend en fin de compte du client, il est donc probable qu'il post-traite la valeur de toute façon.

décomposer
la source
4
"il est assez discutable pourquoi auriez-vous eu des ennuis" - si rien d'autre, c'est la fin du coin. Le prochain client de cette API peut vous demander de lui laisser spécifier un strftimeformat (plus les paramètres régionaux, pour les noms de mois / jour) pour les mêmes raisons de commodité que le premier client a trouvé utile de spécifier un fuseau horaire. Même avec le fuseau horaire comme seule concession, vous avez rendu la réponse de votre API plus complexe: ce n'est plus seulement "un horodatage au même format à chaque fois", c'est "un horodatage exprimé de la façon dont on m'a demandé de l'exprimer"
Steve Jessop
3
Exactement, la complexité. La complexité est mauvaise. Cela fait travailler tout le monde plus dur sans aucune valeur ajoutée pour le produit ou l'entreprise. Mort par mille coupures de papier.
Brandon
2
> Vous devriez revenir un moment absolu, j'ai clarifié ma question que je fais déjà cela. Merci pour votre perspicacité!
marquez
4

Si vous avez déjà la logique de convertir les valeurs datetime dans le fuseau horaire local de l'utilisateur, vous pouvez offrir les deux possibilités dans votre API.

Si un client fait une demande similaire GET /posts, il obtient toutes les heures dans le fuseau horaire par défaut (UTC).
Si un client fait une demande similaire GET /posts?timezone=America/Sao_Paul, toutes les heures de la réponse seront ajustées au fuseau horaire spécifié.

C'est ensuite à l'implémentation client ce qu'ils veulent faire avec les fuseaux horaires.

Bart van Ingen Schenau
la source
2

Habituellement, vous vous attendez à UTC d'une API.

Cependant, si votre «API REST» n'est que la partie côté serveur d'une page Web utilisant un framework javascript. Je dirais qu'en fait, vous renvoyez un ViewModel et qu'il devrait donc contenir des chaînes, des nombres et des heures localisés.

Ewan
la source
2

C'est une mauvaise, mauvaise, mauvaise idée. Considérez une situation où le client stocke les réponses du serveur, puis l'utilisateur se déplace vers un fuseau horaire différent. Maintenant, vous avez une situation où cette "fonctionnalité" ne vous donnera au mieux aucun avantage ou créera d'énormes problèmes.

BTW. Pour combien de fuseaux horaires et combien de clients allez-vous tester cela? Si le serveur donne la réponse attendue pour America / Sao_Paul, que répondra-t-il pour America / Sao_Paulo?

gnasher729
la source
C'était une erreur de ma part, je l'ai corrigée America/Sao_Paulo. Je suppose que c'est pour discuter de ce qui se passe si le fuseau horaire ne peut pas être identifié; soit parce que c'est tout simplement faux, soit parce que la base de données TZ est obsolète (je trouve ce dernier peu probable pour les noms réels [mais pas pour les valeurs de décalage). Cependant, dans les deux cas, je retournerais probablement une 400 BAD_REQUESTréponse.
marquez