REST GET API için önerilen tarih biçimi


105

Bunun gibi bir REST GET API'si için önerilen zaman damgası biçimi nedir:

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

Bence gerçek tarih biçimi, YYYY-MM-DDThh:mm:ssZUTC saati gibi ISO 8601 biçimi olmalıdır .

ISO 8601 sürümünü tire ve iki nokta üst üste olmadan kullanmalı mıyız, örneğin:

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

yoksa ISO 8601 formatını, örneğin base64 kodlamasını kullanarak kodlamalı mıyız?


ISO 8601 formatı neden sizin için bir seçenek değil?
Johannes

@Johannes ISO 8601 formatı (tire ve iki nokta üst üste kullanılmayan versiyonda) uygun olabilirdi, sadece URL'lerde tarihleri ​​temsil etmek için önerilen bir yaklaşım olup olmadığını merak ediyordum
Lorenzo Polidori

Yanıtlar:


77

REST, önerilen bir tarih biçimine sahip değil. Gerçekten de son kullanıcınız ve sisteminiz için en iyi olana indirgeniyor. Kişisel olarak, ISO 8601 (url kodlu) için sahip olduğunuz gibi bir standarda bağlı kalmak isterim.

Çirkin URI husustur sahip değilse (örn url kodlanmış sürümü dahil değil :, -, sende URI) ve (insan) adreslenebilirliği önemli olarak, ayrıca dönem süresini (örn düşünebiliriz değil http://example.com/start/1331162374). URL biraz daha temiz görünüyor, ancak okunabilirliği kesinlikle kaybediyorsunuz.

/2012/03/07Eğer çok görmek başka biçimidir. Sanırım bunu genişletebilirsin. Bu rotaya giderseniz, ya her zaman GMT saatinde olduğunuzdan emin olun (ve bunu belgelerinizde netleştirin) ya da bir tür saat dilimi göstergesi eklemek isteyebilirsiniz.

Sonuçta, API'niz ve son kullanıcınız için neyin işe yaradığına bağlıdır. API'niz sizin için değil, sizin için çalışmalıdır ;-).


12
Teşekkürler, çok faydalı cevap. Sanırım http://api.example.com/start_date/YYYYMMDDThhmmssZ, okunabilirlik ve temiz URL'ler için iyi olan ISO 8601'in (yani ) sıkıştırılmış versiyonunu tercih edeceğim .
Lorenzo Polidori

7
Ama JSON yapar önerilen bir tarih biçimine sahip ve :) 8601 ISO var
Radu Potop

5
@RaduPotop Evet, ancak bu bahsettiğimiz HTTP ve URI standartları. JSON'un bununla ne ilgisi olduğundan emin değilim.
nategood

3
Sadece kısa çizgilerin URL kodlamalı olmasına gerek olmadığını not etmek istiyorum.
user128216

1
Bu bağlantı - agiletribe.wordpress.com/2015/06/10/jsonrest-api-handling-dates, iso-8601 formatıyla yaşanabilecek insan tarafından okunabilirlik sorunlarını önlemek için tam sayı dönemini önerir. Farklı görüşleriniz varsa bana bildirin
Andy Dufresne

97

API tarih ve saatlerinin 5 yasası için bu makaleyi BURADAN kontrol edin :

  • Yasa 1: Tarihleriniz için ISO-8601 kullanın
  • Kural # 2: Herhangi bir saat dilimini kabul edin
  • Yasa # 3: UTC'de saklayın
  • Yasa # 4: UTC'de iade edin
  • Kanun # 5: İhtiyacınız yoksa zamanı kullanmayın

Dokümanlarda daha fazla bilgi.


2
-1, 2017-11-20T11%3A00%3A00Zçok okunabilir olmadığı gibi . Ayrıca (IIS'ye özgü) , kodlanmış olsalar bile URL'lerdeki iki nokta üst üste işaretleri konusunda çok paranoyak görünmektedir .
Iain

3
Bu bağlantı - agiletribe.wordpress.com/2015/06/10/jsonrest-api-handling-dates , iso-8601 formatında yaşanabilecek insan tarafından okunabilirlik sorunlarını önlemek için tamsayı dönemi önerir. Farklı görüşleriniz varsa bana bildirin.
Andy Dufresne

5
Kısa çizgilerin ve noktaların URL'lerde ayrılmış karakterler olmadığını unutmayın. Yalnızca iki nokta üst üste URL kodlaması gerektirir ( en.wikipedia.org/wiki/Percent-encoding ). ISO-8601'de ( en.wikipedia.org/wiki/ISO_8601 ) kısa çizgiler gereklidir ancak iki nokta üst üste işaretleri isteğe bağlıdır. Bu nedenle, URL'lerde kullanılacak doğru ISO-8601 varyantları, daha fazla hassasiyete ihtiyacınız varsa YYYY-AA-GGTssssssZ ve YYYY-MM-DDThmmss.mmmZ'dir.
Bruce Adams

Sık bağlantılı ve çok tartışılan bir makale. Bir dizge olması gerekiyorsa , sıralanabilir bir biçimin seçimine katılıyorum, ancak bir unix zaman damgası (makalenin bile kabul etmediği) belirtilen faydaların her birine ve daha fazlasına sahiptir. Sunuma kadar, saat dilimleri ve gün ışığından yararlanma (ve siyasi kararlar) sorunları bile mevcut değil.
kaay

18

RFC6690 - Kısıtlı dinlendirici Ortamları (çekirdek) Bağlantı Biçimi açıkça Ancak ne olması gerektiğini Tarih biçimi halini yok mu bölüm 2. Bağlantı Format yap Bu tarih türü için o öneri ima RFC 3986. işaret RFC 3986 kullanılmalıdır.

Temel olarak RFC 3339 İnternetteki Tarih ve Saat, bakılması gereken bir belgedir ve şunları söyler:

Miladi takvimi kullanarak tarihlerin ve saatlerin gösterimi için ISO 8601 standardının bir profili olan İnternet protokollerinde kullanım için tarih ve saat formatı.

bunun kaynağı: YYYY-AA-ggTHH: mm: ss.ss ± hh: mm

(örneğin, 1937-01-01T12: 00: 27.87 + 00: 20)

En güvenli bahis.


13

Girdi / çıktıdaki her tarih saat alanının UNIX / epoch biçiminde olması gerekir. Bu, API'nin farklı taraflarındaki geliştiriciler arasındaki karışıklığı önler.

Artıları:

  • Epoch formatının bir saat dilimi yoktur.
  • Epoch'un tek bir formatı vardır (Unix zamanı tek imzalı bir sayıdır).
  • Dönem zamanı, yaz saatinden etkilenmez.
  • Arka uç çerçevelerinin çoğu ve tüm yerel ios / android API'ler, çağ dönüşümünü destekler.
  • Yerel zaman dönüştürme kısmı, kullanıcının cihazının / tarayıcısının saat dilimi ayarına bağlı olarak tamamen uygulama tarafında yapılabilir.

Eksileri:

  • Veritabanında UTC biçiminde depolamak için UTC'ye dönüştürmek için ekstra işlem.
  • Giriş / çıkışın okunabilirliği.
  • GET URL'lerinin okunabilirliği.

Notlar:

  • Zaman dilimleri bir sunum katmanı problemidir! Kodunuzun çoğu saat dilimleriyle veya yerel saatle ilgilenmemeli, Unix zamanından geçiyor olmalıdır.
  • İnsan tarafından okunabilir bir zamanı (örneğin, günlükler) saklamak istiyorsanız, bunu Unix zamanı yerine Unix zamanı ile birlikte depolamayı düşünün.

1
Daha fazla anlaşamadım.
Jorge.V

1
Buna ekleyeceğim tek şey, sisteminizin herhangi bir yerinde milisaniyeleri dikkate almanız gerekip gerekmediğini en baştan düşünmektir. Öyleyse, Unix zaman damgasının milisaniye sürümünü kullanın.
jamesjansson

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.