Zalecany format daty dla REST GET API


105

Jaki jest zalecany format sygnatury czasowej dla REST GET API, taki jak ten:

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

Myślę, że rzeczywisty format daty powinien być formatem ISO 8601, na przykład YYYY-MM-DDThh:mm:ssZdla czasu UTC.

Czy powinniśmy używać wersji ISO 8601 bez myślników i dwukropków, na przykład:

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

czy też powinniśmy zakodować format ISO 8601, używając na przykład kodowania base64?


Dlaczego format ISO 8601 w obecnej postaci nie jest opcją dla Ciebie?
Johannes

@Johannes format ISO 8601 (w wersji bez myślników i dwukropków) byłby w porządku, zastanawiałem się tylko, czy jest jakieś zalecane podejście do reprezentowania dat w adresach URL
Lorenzo Polidori

Odpowiedzi:


77

REST nie ma zalecanego formatu daty. Naprawdę sprowadza się to do tego, co działa najlepiej dla użytkownika końcowego i systemu. Osobiście chciałbym trzymać się standardu, takiego jak masz dla ISO 8601 (zakodowany adres URL).

Jeśli nie mają brzydki URI jest problemem (np nie licząc url zakodowanej wersji :, -, w was URI) i (ludzka) Adresowalność nie jest tak ważne, można również wziąć pod uwagę czas epoki (np http://example.com/start/1331162374). Adres URL wygląda trochę bardziej czytelnie, ale z pewnością tracisz czytelność.

To /2012/03/07kolejny format, który często widzisz. Przypuszczam, że można by to rozwinąć. Jeśli wybierzesz tę trasę, po prostu upewnij się, że jesteś zawsze w czasie GMT (i wyjaśnij to w dokumentacji) lub możesz również chcieć uwzględnić jakiś wskaźnik strefy czasowej.

Ostatecznie sprowadza się to do tego, co działa dla twojego API i twojego użytkownika końcowego. Twoje API powinno działać dla Ciebie, a nie dla Ciebie ;-).


12
Dzięki, bardzo przydatna odpowiedź. Myślę, że zdecyduję się na skompresowaną wersję ISO 8601 (tj. http://api.example.com/start_date/YYYYMMDDThhmmssZ), Która jest dobra dla czytelności i czystych adresów URL.
Lorenzo Polidori

7
Ale JSON nie ma Zalecany format daty i to ISO 8601 :)
Radu Potop

@stalemate Date obiekty domyślnie serializują jako ciąg zawierający datę w formacie ISO. developer.mozilla.org/en-US/docs/JSON
Radu Potop

5
@RaduPotop Tak, ale mówimy o standardach HTTP i URI. Nie jestem pewien, co ma z tym wspólnego JSON.
nategood

3
Chcę tylko zauważyć, że łączniki nie muszą być kodowane w adresie URL.
user128216

97

Przeczytaj ten artykuł, aby poznać 5 praw dotyczących dat i godzin API TUTAJ :

  • Prawo nr 1: używaj ISO-8601 do dat
  • Prawo nr 2: Zaakceptuj dowolną strefę czasową
  • Prawo nr 3: Przechowuj to w UTC
  • Prawo # 4: Zwróć go w UTC
  • Prawo nr 5: Nie wykorzystuj czasu, jeśli go nie potrzebujesz

Więcej informacji w dokumentacji.


2
-1, ponieważ 2017-11-20T11%3A00%3A00Zjest po prostu mało czytelny. Ponadto (specyficzne dla IIS) wydaje się, że dwukropki w adresach URL są bardzo paranoiczne, nawet jeśli są one zakodowane.
Iain

2
Ten link - agiletribe.wordpress.com/2015/06/10/jsonrest-api-handling-dates zaleca epokę liczb całkowitych, aby uniknąć problemów z czytelnością dla ludzi, które mogą wystąpić w przypadku formatu iso-8601. Daj mi znać, jeśli masz różne poglądy.
Andy Dufresne

5
Pamiętaj, że łączniki i kropki nie są znakami zastrzeżonymi w adresach URL. Tylko dwukropki wymagają kodowania adresu URL ( en.wikipedia.org/wiki/Percent-encoding ). W ISO-8601 ( en.wikipedia.org/wiki/ISO_8601 ) łączniki są wymagane, ale dwukropki są opcjonalne. Tak więc prawidłowe warianty ISO-8601 do użycia w adresach URL to RRRR-MM-DDThhmmssZ i RRRR-MM-DDThhmmss.mmmZ, jeśli potrzebujesz większej precyzji.
Bruce Adams

Artykuł często powiązany i intensywnie dyskutowany. Chociaż zgadzam się z wyborem formatu , który można sortować, jeśli w ogóle musi to być ciąg znaków , uniksowy znacznik czasu (którego artykuł nawet nie uznaje) ma wszystkie wymienione zalety i więcej. Do chwili prezentacji kwestie stref czasowych i czasu letniego (i decyzji politycznych) nawet nie istnieją.
kaay

18

RFC6690 - Format łącza ograniczonych środowisk RESTful (CoRE) Nie określa wyraźnie, jaki powinien być format daty, jednak w sekcji 2. Format łącza wskazuje na RFC 3986. Oznacza to, że należy stosować zalecenie dotyczące typu daty w dokumencie RFC 3986 .

Zasadniczo RFC 3339 Data i godzina w Internecie to dokument, któremu należy się przyjrzeć, który mówi:

format daty i czasu do użytku w protokołach internetowych, który jest profilem standardu ISO 8601 do przedstawiania dat i godzin przy użyciu kalendarza gregoriańskiego.

do czego to się sprowadza: RRRR-MM-ddTHH: mm: ss.ss ± gg: mm

(np. 1937-01-01T12: 00: 27.87 + 00: 20)

To najbezpieczniejszy zakład.


12

Każde pole typu data i godzina w wejściu / wyjściu musi mieć format UNIX / epoch . Pozwala to uniknąć zamieszania między programistami z różnych stron interfejsu API.

Plusy:

  • Format epoki nie ma strefy czasowej.
  • Epoka ma jeden format (czas uniksowy to pojedyncza liczba ze znakiem).
  • Czas letni nie ma wpływu na czas epoki.
  • Większość frameworków zaplecza i wszystkie natywne interfejsy API iOS / Android obsługują konwersję epok.
  • Część konwersji czasu lokalnego może być wykonana całkowicie po stronie aplikacji, w zależności od ustawień strefy czasowej urządzenia / przeglądarki użytkownika.

Cons:

  • Dodatkowe przetwarzanie do konwersji na UTC w celu przechowywania w formacie UTC w bazie danych.
  • Czytelność wejścia / wyjścia.
  • Czytelność adresów URL GET.

Uwagi:

  • Strefy czasowe to problem warstwy prezentacji! Większość twojego kodu nie powinna zajmować się strefami czasowymi ani czasem lokalnym, powinien przepuszczać czas uniksowy.
  • Jeśli chcesz przechowywać czas czytelny dla człowieka (np. Logi), rozważ przechowywanie go razem z czasem uniksowym, a nie zamiast czasu uniksowego.

1
Nie mogłem się bardziej zgodzić.
Jorge.V

1
Jedyne, co chciałbym do tego dodać, to zastanowić się od samego początku, czy będziesz musiał rozważyć milisekundy w dowolnym miejscu w systemie. Jeśli tak, użyj milisekundowej wersji znacznika czasu systemu Unix.
jamesjansson

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.