Bir REST API, tarih saatini uygun istemcilerin saat dilimine dönüştürebilmelidir mi?


10

API'mizi uygularken, tarih ve saat dilimleri sorunu gündeme geldi.

Tüm tarihler veritabanında UTC olarak normalleştirilir. Şu anda, API dışı uygulamada, tüm tarihler, sunulmadan önce kullanıcı tercihlerine göre dönüştürülür.

Şimdi aynı soru API için geldi: API, istek semantiğine dayalı bir saat dilimine uygun tarih saatini döndürebiliyor mu?

Örneğin GET /posts?timezone=America/Sao_Paulo?

Yoksa API'ya erişen herhangi bir müşteri için de yapılmalı mıdır?

Güncelleme: bir kaç kez gündeme geldi başlangıcı: Şu anda zaman damgalarını ile saat dilimi döndürülür (her zaman var TZ ofset rağmen +00:00). Biçim popüler 8601:2015-10-29T23:00:49+00:00


Bir saat dilimi içeren bir zaman damgası döndürürseniz, istemci bunu gerekli yerel saate kolayca dönüştürebilir. Her neyse, bu soru REST ile ilgili görünmüyor. Bunu uygulamak için REST ilkelerini ihlal etmeyen birçok yol vardır. Bu parametreyi ortaya çıkarmanın sizin için daha fazla çalışma anlamına geldiğini lütfen unutmayın. Gerçekten RESTful bir mimaride, bu bağlantıları bir şekilde keşfedilebilir hale getirmeniz gerekir. Hem istemci hem de sunucu tarafında uygulamak gereksiz yere karmaşık bir şey olarak beni vuruyor.
toniedzwiedz

> Hem istemci hem de sunucu tarafında uygulamak gereksiz yere karmaşık bir şey gibi geliyor. Giriş için teşekkürler!
işaretleyin

Yanıtlar:


17

Mutlak bir noktayı zamanında iade etmelisiniz , o zaman herkes bu zaman damgasını gerektiği gibi yerelleştirebilir. "Mutlak zaman damgası" ile, standart bir ISO biçiminden birinde, örneğin "2007-04-05T14: 30Z" gibi zaman dilimini içeren bir UNIX zaman damgası veya insan tarafından okunabilir bir zaman damgası anlamına gelir. Bu, önemsiz bir şekilde müşteri tarafından yerel bir saat dilimine dönüştürülebilir.

Bir saat dilimi parametresini kabul etmek ve zaman damgasını bu saat dilimine yerelleştirmek istiyorsanız, ancak yine de mutlak zaman damgası dahil etmelisiniz. yanıtınızdaki saat dilimi, örneğin "2007-04-05T16: 30-02: 00". Bu değerin önceki yerelleştirilmemiş değerle aynı olduğu düşünüldüğünde, neden bu parametreyi sunma sorununu yaşadığınızı sorgulamak oldukça zordur. Zaman damgasının tam görüntüleme biçimi nihayetinde istemcinin ön ucuna kadardır, bu nedenle değeri yine de sonradan işleme koyacaktır.


4
"Neden belanın üstesinden geleceğiniz oldukça tartışmalı" - başka bir şey yoksa, kamanın ince ucu. Bu API'nın bir sonraki istemcisi sizden strftime, ilk istemcinin bir saat dilimi belirtmenin yararlı olduğunu düşündüğü kolaylık nedenleriyle bir biçim (artı yerel ayar, ay / gün adları için) belirlemelerini istemenizi isteyebilir . Tek imtiyaz olarak saat dilimi ile bile, API'nızın yanıtını daha karmaşık hale getirdiniz: artık sadece "her seferinde aynı formatta bir zaman damgası" değil, "onu ifade etmemin istendiği şekilde ifade edilen bir zaman damgası"
Steve Jessop

3
Kesinlikle, karmaşıklık. Karmaşıklık kötülüktür. Ürüne veya işletmeye katma değer vermeden herkesin daha fazla çalışmasını sağlar. Binlerce kağıt kesilerek ölüm.
Brandon

2
> Zamanında mutlak bir noktaya dönmelisin, bunu zaten yaptığım sorusunu netleştirdim. Fikriniz için teşekkürler!
işaretleyin

4

Tarih-saat değerlerini kullanıcının yerel saat dilimine dönüştürme mantığınız zaten varsa, API'nizde her iki olasılığı da sunabilirsiniz.

İstemci gibi bir istekte bulunursa GET /posts, tüm zamanları varsayılan saat diliminde (UTC) alır.
İstemci gibi bir istekte bulunursa GET /posts?timezone=America/Sao_Paul, yanıttaki tüm saatler belirtilen saat dilimine göre ayarlanır.

Daha sonra zaman dilimleri ile ne yapmak istedikleri istemci uygulamasına bağlıdır.


2

Genellikle bir API'dan UTC beklersiniz.

Ancak, 'REST API'niz bir javascript çerçevesi kullanan bir web sayfasının sunucu tarafı kısmı ise. Aslında bir ViewModel döndürdüğünü ve böylece yerelleştirilmiş dizeleri, sayıları ve saatleri içermesi gerektiğini iddia ediyorum.


2

Kötü, kötü, kötü bir fikir. İstemcinin yanıtları sunucudan depoladığı ve daha sonra kullanıcının farklı bir saat dilimine gittiği bir durumu düşünün. Artık bu "özellik" in size hiçbir şekilde avantaj sağlamayacağı veya çok büyük bir sorun yaratacağı bir durum var.

BTW. Kaç saat dilimi ve kaç müşteri için bunu test edeceksiniz? Sunucu Amerika / Sao_Paul için beklenen yanıtı verirse, Amerika / Sao_Paulo için ne cevap verecektir?


Bu benim açımdan bir hataydı, düzelttim America/Sao_Paulo. Sanırım saat dilimi tanımlanamazsa ne olacağı tartışmaya açık; ya düz yanlış olduğundan ya da TZ veritabanı güncel olmadığından (gerçek isimler için ikincisini pek olası bulmuyorum [fakat ofset değerleri için öyle değil). Ancak, her iki durumda da, muhtemelen bir 400 BAD_REQUESTyanıt dönecekti .
işareti
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.