Рекомендований формат дати для REST GET API


105

Який рекомендований формат часової позначки для REST GET API на зразок цього:

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

Я думаю, що фактичний формат дати має бути у форматі ISO 8601, наприклад, YYYY-MM-DDThh:mm:ssZза UTC.

Чи слід використовувати версію ISO 8601 без дефісів та колонок, таких як:

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

чи ми повинні кодувати формат ISO 8601, використовуючи, наприклад, кодування base64?


Чому формат ISO 8601 не є варіантом для вас?
Йоганнес

@Johannes Формат ISO 8601 (у версії без дефісів та колонок) буде нормально, мені просто цікаво, чи є такий собі рекомендований підхід для представлення дат у URL-адресах
Лоренцо Полідорі

Відповіді:


77

REST не має рекомендованого формату дати. Дійсно, це зводиться до того, що найкраще підходить для вашого кінцевого користувача та вашої системи. Особисто я хотів би дотримуватися такого стандарту, як у вас для ISO 8601 (зашифрований URL).

Якщо не мають потворні URI є проблемою (наприклад , не вмикаючи URL - адреса закодованої версії :, -, в вас URI) і адресація (людина) не так важливо, ви могли б також розглянути питання про часу доби (наприклад http://example.com/start/1331162374). URL виглядає дещо чіткіше, але ви, звичайно, втрачаєте читабельність.

/2012/03/07Ще один формат , який ви бачите багато. Ви можете розширити це, я думаю. Якщо ви йдете цим маршрутом, просто переконайтеся, що ви завжди в часі GMT (і уточніть це у вашій документації), або ви також можете включити якийсь показник часового поясу.

Зрештою, це зводиться до того, що працює для вашого API та вашого кінцевого користувача. Ваш API повинен працювати на вас, а не на нього ;-).


12
Дякую, дуже корисна відповідь. Думаю, я піду для стислої версії ISO 8601 (тобто http://api.example.com/start_date/YYYYMMDDThhmmssZ), яка корисна для читання та чистих URL-адрес.
Лоренцо Полідорі

7
Але JSON дійсно має рекомендовану формат дати і це ISO 8601 :)
Radu Potop

Об'єкти дати @stalemate за замовчуванням серіалізують як рядок, що містить дату у форматі ISO. developer.mozilla.org/en-US/docs/JSON
Radu Potop

5
@RaduPotop Так, але ми говоримо про стандарти HTTP та URI. Я не впевнений, що стосується JSON.
nategood

3
Я просто хочу зазначити, що дефіси не потрібно кодувати URL-адресами.
користувач128216

97

Перегляньте цю статтю щодо 5 законів дати та часу API тут :

  • Закон №1: Використовуйте ISO-8601 для своїх побачень
  • Закон №2: Прийміть будь-який часовий пояс
  • Закон №3: зберігайте його в UTC
  • Закон №4: Поверніть його за UTC
  • Закон №5: Не використовуйте час, якщо він вам не потрібен

Більше інформації в документах.


2
-1, як 2017-11-20T11%3A00%3A00Zце просто не дуже читабельно. Також (специфічно для IIS), здається, дуже параноїчно щодо колонок у URL-адресах, навіть якщо вони закодовані.
Iain

2
Це посилання - agiletribe.wordpress.com/2015/06/10/jsonrest-api-handling-dates рекомендує цілу епоху, щоб уникнути проблем з читабельністю людей, які можуть виникнути у форматі iso-8601. Повідомте мене, якщо у вас різні погляди.
Енді Дуфресне

5
Зауважте, що дефіси та крапки не є зарезервованими символами в URL-адресах. Тільки колонки потребують кодування URL-адрес ( en.wikipedia.org/wiki/Percent-encoding ). У ISO-8601 ( en.wikipedia.org/wiki/ISO_8601 ) дефіси обов'язкові, але колонки необов’язкові. Тож правильні варіанти ISO-8601 для використання в URL-адресах - YYYY-MM-DDThhmmssZ та YYYY-MM-DDThhmmss.mmmZ, якщо вам потрібна більша точність.
Брюс Адамс

Стаття, що часто пов'язується та широко обговорюється. Хоча я погоджуюся з вибором формату сортування, якщо він взагалі повинен бути рядком , часова мітка Unix (яку стаття навіть не визнає) має кожну із заявлених переваг та багато іншого. До презентації питань часових поясів та літнього часу (і політичних рішень) навіть не існує.
kaay

18

RFC6690 - Формат посилань з обмеженими RESTful середовищами (CoRE) Не вказується чітко, який формат дати має бути, однак у розділі 2. Формат посилання вказує на RFC 3986. Це означає, що слід використовувати рекомендації щодо типу дати в RFC 3986 .

В основному, дата та час RFC 3339 в Інтернеті - це документ, який слід переглянути:

формат дати та часу для використання в Інтернет-протоколах, що є профілем стандарту ISO 8601 для представлення дат і часу за допомогою григоріанського календаря.

що це зводиться до: РРРР-MM-ddTHH: мм: ss.ss ± hh: mm

(наприклад, 1937-01-01T12: 00: 27,87 + 00: 20)

Це найбезпечніша ставка.


12

Кожне поле дати введення / виведення повинно бути у форматі UNIX / епохи . Це дозволяє уникнути плутанини між розробниками в різних сторонах API.

Плюси:

  • Формат епохи не має часового поясу.
  • Епоха має єдиний формат (час Unix - це єдиний підписаний номер).
  • Час епохи не впливає на літній час.
  • Більшість фреймворків Backend та всі рідні API ios / android підтримують епоху перетворення.
  • Місцева частина перетворення часу може бути виконана повністю на стороні програми, залежить від налаштування часового поясу пристрою / браузера користувача.

Мінуси:

  • Додаткова обробка для перетворення в UTC для зберігання у форматі UTC у базі даних.
  • Читання вводу / виводу
  • Читання GET URL-адрес.

Примітки:

  • Часові пояси - проблема шару презентації! Більшість вашого коду не повинна мати справу з часовими поясами або місцевим часом, це має проходити час Unix.
  • Якщо ви хочете зберігати читаний для людини час (наприклад, журнали), подумайте, як зберігати його разом із часом Unix, а не час Unix.

1
Не можу погодитися більше.
Хорхе.V

1
Єдине, що я хотів би додати до цього, це розглянути з самого початку, чи вам доведеться враховувати мілісекунди в будь-якій точці вашої системи. Якщо так, використовуйте мілісекундну версію часової мітки Unix.
jamesjansson

1

Завжди використовуйте UTC:

Наприклад, у мене є компонент розкладу, який містить один параметр DATETIME. Коли я називаю це за допомогою дієслова GET, я використовую наступний формат, де ім'я вхідного параметра є rasporedDate.

Приклад:
https: // localhost / api / getScheduleForDate? RasporedDate = 2003-11-21T01: 11: 11Z

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.