Formato della data consigliato per l'API REST GET


105

Qual è il formato di timestamp consigliato per un'API REST GET come questa:

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

Penso che il formato della data effettivo dovrebbe essere il formato ISO 8601, ad esempio YYYY-MM-DDThh:mm:ssZper l'ora UTC.

Dovremmo usare la versione ISO 8601 senza trattini e due punti, come ad esempio:

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

o dovremmo codificare il formato ISO 8601, usando ad esempio la codifica base64?


Perché il formato ISO 8601 non è un'opzione per te?
Johannes

@Johannes il formato ISO 8601 (nella versione senza trattini e due punti) andrebbe bene, mi chiedevo solo se esiste una sorta di approccio consigliato per rappresentare le date negli URL
Lorenzo Polidori

Risposte:


77

REST non ha un formato di data consigliato. In realtà si riduce a ciò che funziona meglio per l'utente finale e il sistema. Personalmente, vorrei attenermi a uno standard come quello che hai per ISO 8601 (URL codificato).

Se non avendo brutto URI è una preoccupazione (ad esempio, non compresa la versione codificata URL del :, -, in voi URI) e indirizzabilità (umana) non è così importante, si potrebbe anche prendere in considerazione il tempo dell'epoca (ad esempio http://example.com/start/1331162374). L'URL sembra un po 'più pulito, ma sicuramente perdi la leggibilità.

Il /2012/03/07è un altro formato si vede un sacco. Potresti approfondire questo, suppongo. Se segui questa strada, assicurati di essere sempre nell'ora GMT (e chiariscilo nella tua documentazione) o potresti anche voler includere una sorta di indicatore di fuso orario.

In definitiva, si riduce a ciò che funziona per la tua API e il tuo utente finale. La tua API dovrebbe funzionare per te, non per te ;-).


12
Grazie, risposta molto utile. Penso che sceglierò la versione compressa di ISO 8601 (cioè http://api.example.com/start_date/YYYYMMDDThhmmssZ) che è buona per la leggibilità e gli URL puliti.
Lorenzo Polidori

7
Ma JSON ha avere un formato di data consigliata ed è ISO 8601 :)
Radu Potop

@stalemate Gli oggetti Date vengono serializzati per impostazione predefinita come una stringa contenente la data in formato ISO. developer.mozilla.org/en-US/docs/JSON
Radu Potop

5
@RaduPotop Sì, ma stiamo parlando degli standard HTTP e URI. Non sono sicuro di cosa abbia a che fare JSON con questo.
nategood

3
Voglio solo notare che i trattini non devono essere codificati in URL.
user128216

97

Controlla questo articolo per le 5 leggi di date e orari API QUI :

  • Legge # 1: usa ISO-8601 per le tue date
  • Legge n. 2: accetta qualsiasi fuso orario
  • Legge n. 3: conservalo in UTC
  • Legge n. 4: restituirlo in UTC
  • Legge # 5: non usare il tempo se non ne hai bisogno

Maggiori informazioni nei documenti.


2
-1, in quanto 2017-11-20T11%3A00%3A00Znon è molto leggibile. Inoltre (specifico per IIS) sembra essere molto paranoico riguardo ai due punti negli URL anche se sono codificati.
Iain

2
Questo link - agiletribe.wordpress.com/2015/06/10/jsonrest-api-handling-dates consiglia l'epoca intera per evitare problemi di leggibilità umana che potrebbero essere riscontrati con il formato iso-8601. Fammi sapere se hai opinioni diverse.
Andy Dufresne

5
Tieni presente che trattini e punti non sono caratteri riservati negli URL. Solo i due punti richiedono la codifica dell'URL ( en.wikipedia.org/wiki/Percent-encoding ). In ISO-8601 ( en.wikipedia.org/wiki/ISO_8601 ) i trattini sono obbligatori ma i due punti sono facoltativi. Pertanto, le varianti ISO-8601 corrette da utilizzare negli URL sono AAAA-MM-GGThhmmssZ e AAAA-MM-GGThhmmss.mmmZ se è necessaria una maggiore precisione.
Bruce Adams

Un articolo spesso collegato e molto dibattuto. Anche se sono d'accordo con la scelta di un formato ordinabile se deve essere una stringa , un timestamp unix (che l'articolo non riconosce nemmeno) ha tutti i vantaggi dichiarati e altro ancora. Fino alla presentazione, le questioni dei fusi orari e dell'ora legale (e delle decisioni politiche) non esistono nemmeno.
Kaay

18

RFC6690 - Constrained RESTful Environments (CoRE) Formato collegamento Non indica esplicitamente quale formato data dovrebbe essere tuttavia nella sezione 2. Formato collegamento punta a RFC 3986. Ciò implica che la raccomandazione per il tipo di data in RFC 3986 dovrebbe essere utilizzata.

Fondamentalmente RFC 3339 Data e ora su Internet è il documento da guardare che dice:

formato di data e ora per l'utilizzo nei protocolli Internet che è un profilo dello standard ISO 8601 per la rappresentazione di date e ore utilizzando il calendario gregoriano.

a cosa si riduce: AAAA-MM-ggTHH: mm: ss.ss ± hh: mm

(ad esempio 1937-01-01T12: 00: 27.87 + 00: 20)

È la scommessa più sicura.


12

Ogni campo data / ora in input / output deve essere in formato UNIX / epoch . Ciò evita la confusione tra gli sviluppatori su diversi lati dell'API.

Professionisti:

  • Il formato Epoch non ha un fuso orario.
  • Epoch ha un unico formato (l'ora Unix è un numero con segno singolo).
  • L'ora dell'epoca non viene influenzata dall'ora legale.
  • La maggior parte dei framework di backend e tutte le API native ios / android supportano la conversione dell'epoca.
  • La parte di conversione dell'ora locale può essere eseguita interamente dal lato dell'applicazione a seconda dell'impostazione del fuso orario del dispositivo / browser dell'utente.

Contro:

  • Elaborazione aggiuntiva per la conversione in UTC per l'archiviazione in formato UTC nel database.
  • Leggibilità di input / output.
  • Leggibilità degli URL GET.

Appunti:

  • I fusi orari sono un problema a livello di presentazione! La maggior parte del tuo codice non dovrebbe avere a che fare con i fusi orari o l'ora locale, dovrebbe passare il tempo Unix.
  • Se vuoi memorizzare un'ora leggibile dall'uomo (ad esempio i log), considera di memorizzarla insieme all'ora Unix, non al posto dell'ora Unix.

1
Non potrei essere più d'accordo.
Jorge.V

1
L'unica cosa che aggiungerei a questo è considerare dall'inizio se sarà necessario considerare i millisecondi in qualsiasi punto del sistema. In tal caso, utilizzare la versione in millisecondi del timestamp Unix.
jamesjansson

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.