Format tanggal yang direkomendasikan untuk REST GET API

105

Apa format stempel waktu yang direkomendasikan untuk REST GET API seperti ini:

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

Saya rasa format tanggal sebenarnya harus dalam format ISO 8601, seperti YYYY-MM-DDThh:mm:ssZuntuk waktu UTC.

Haruskah kita menggunakan versi ISO 8601 tanpa tanda hubung dan titik dua, seperti:

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

atau haruskah kita menyandikan format ISO 8601, menggunakan misalnya pengkodean base64?

Lorenzo Polidori
sumber
Mengapa format ISO 8601 tidak seperti apa adanya, pilihan untuk Anda?
Johannes
@Johannes format ISO 8601 (dalam versi tanpa tanda hubung dan titik dua) akan baik-baik saja, saya hanya ingin tahu apakah ada semacam pendekatan yang disarankan untuk merepresentasikan tanggal di URL
Lorenzo Polidori

Jawaban:

77

REST tidak memiliki format tanggal yang direkomendasikan. Benar-benar intinya pada apa yang terbaik untuk pengguna akhir dan sistem Anda. Secara pribadi, saya ingin tetap berpegang pada standar seperti yang Anda miliki untuk ISO 8601 (dikodekan url).

Jika tidak memiliki jelek URI adalah kekhawatiran (misalnya tidak termasuk url versi dikodekan dari :, -, di dalam kamu URI) dan (manusia) addressability tidak sepenting, Anda juga dapat mempertimbangkan waktu zaman (misalnya http://example.com/start/1331162374). URL terlihat sedikit lebih bersih, tetapi Anda pasti kehilangan keterbacaan.

Ini /2012/03/07adalah format lain yang sering Anda lihat. Anda bisa mengembangkannya, saya kira. Jika Anda mengikuti rute ini, pastikan Anda selalu dalam waktu GMT (dan jelaskan dalam dokumentasi Anda) atau Anda mungkin juga ingin memasukkan semacam indikator zona waktu.

Pada akhirnya, intinya pada apa yang berhasil untuk API dan pengguna akhir Anda. API Anda seharusnya bekerja untuk Anda, bukan Anda untuk itu ;-).

nategood
sumber
12
Terima kasih, jawaban yang sangat berguna. Saya rasa saya akan menggunakan versi terkompresi dari ISO 8601 (yaitu http://api.example.com/start_date/YYYYMMDDThhmmssZ) yang baik untuk keterbacaan dan URL yang bersih.
Lorenzo Polidori
7
Tetapi JSON memang memiliki format tanggal yang direkomendasikan dan itu ISO 8601 :)
Radu Potop
@stalemate Objek Tanggal secara default membuat serial sebagai string yang berisi tanggal dalam format ISO. developer.mozilla.org/en-US/docs/JSON
Radu Potop
5
@RaduPotop Ya, tapi ini adalah standar HTTP dan URI yang sedang kita bicarakan. Saya tidak yakin apa hubungannya JSON dengannya.
nategood
3
Saya hanya ingin mencatat bahwa tanda hubung tidak perlu disandikan ke URL.
pengguna128216
97

Periksa artikel ini untuk 5 hukum tanggal dan waktu API DI SINI :

  • Hukum # 1: Gunakan ISO-8601 untuk tanggal Anda
  • Hukum # 2: Terima zona waktu mana saja
  • Hukum # 3: Simpan di UTC
  • Hukum # 4: Kembalikan dalam UTC
  • Hukum # 5: Jangan gunakan waktu jika Anda tidak membutuhkannya

Info lebih lanjut di dokumen.

mohamed-ibrahim
sumber
2
-1, karena 2017-11-20T11%3A00%3A00Ztidak terlalu mudah dibaca. Juga (khusus IIS) tampaknya sangat paranoid tentang titik dua di URL meskipun mereka dikodekan.
Iain
2
Tautan ini - agiletribe.wordpress.com/2015/06/10/jsonrest-api-handling-dates merekomendasikan periode integer untuk menghindari masalah keterbacaan manusia yang dapat dialami dengan format iso-8601. Beri tahu saya jika Anda memiliki pandangan berbeda.
Andy Dufresne
5
Perhatikan bahwa tanda hubung dan titik bukan karakter yang dipesan di URL. Hanya titik dua yang memerlukan pengkodean URL ( en.wikipedia.org/wiki/Percent-encoding ). Dalam ISO-8601 ( en.wikipedia.org/wiki/ISO_8601 ) tanda hubung diperlukan tetapi titik dua bersifat opsional. Jadi varian ISO-8601 yang benar untuk digunakan di URL adalah YYYY-MM-DDThhmmssZ dan YYYY-MM-DDThhmmss.mmmZ jika Anda membutuhkan presisi yang lebih tinggi.
Bruce Adams
Artikel yang sering ditautkan dan sangat diperdebatkan. Meskipun saya setuju dengan pilihan format yang dapat diurutkan jika itu harus berupa string , stempel waktu unix (yang bahkan tidak diakui oleh artikel) memiliki semua manfaat yang dinyatakan dan banyak lagi. Sampai presentasi, masalah zona waktu dan penghematan siang hari (dan keputusan politik) bahkan tidak ada.
kaay
18

RFC6690 - Format Link Constrained RESTful Environments (CoRE) Tidak secara eksplisit menyatakan format Tanggal apa yang harus digunakan, namun di bagian 2. Format Link mengacu pada RFC 3986. Ini menyiratkan bahwa rekomendasi untuk jenis tanggal di RFC 3986 harus digunakan.

Pada dasarnya RFC 3339 Tanggal dan Waktu di Internet adalah dokumen yang harus dilihat yang mengatakan:

format tanggal dan waktu untuk digunakan dalam protokol Internet yang merupakan profil standar ISO 8601 untuk representasi tanggal dan waktu menggunakan kalender Gregorian.

intinya: YYYY-MM-hhTHH: mm: ss.ss ± hh: mm

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

Adalah taruhan teraman.

Matas Vaitkevicius
sumber
12

Setiap bidang datetime dalam input / output harus dalam format UNIX / epoch . Ini menghindari kebingungan di antara developer di berbagai sisi API.

Kelebihan:

  • Format zaman tidak memiliki zona waktu.
  • Epoch memiliki format tunggal (waktu Unix adalah nomor bertanda tunggal).
  • Waktu waktu tidak dipengaruhi oleh pergeseran waktu siang hari.
  • Sebagian besar framework Backend dan semua API ios / android asli mendukung konversi epoch.
  • Bagian konversi waktu lokal dapat dilakukan seluruhnya di sisi aplikasi tergantung pada pengaturan zona waktu perangkat / browser pengguna.

Kekurangan:

  • Pemrosesan ekstra untuk mengonversi ke UTC untuk disimpan dalam format UTC di database.
  • Keterbacaan input / output.
  • Keterbacaan GET URL.

Catatan:

  • Zona waktu adalah masalah lapisan presentasi! Sebagian besar kode Anda tidak boleh berurusan dengan zona waktu atau waktu lokal, kode harus melewati waktu Unix.
  • Jika Anda ingin menyimpan waktu yang dapat dibaca secara manusiawi (misalnya log), pertimbangkan untuk menyimpannya bersama dengan waktu Unix, bukan waktu Unix.
Mithun Sreedharan
sumber
1
Sangat setuju.
Jorge.V
1
Satu-satunya hal yang akan saya tambahkan adalah mempertimbangkan dari awal apakah Anda perlu mempertimbangkan milidetik di mana saja di sistem Anda. Jika demikian, gunakan stempel waktu Unix versi milidetik.
jamesjansson
1

Selalu gunakan UTC:

Misalnya saya memiliki komponen jadwal yang mengambil satu parameter DATETIME. Ketika saya memanggil ini menggunakan kata kerja GET, saya menggunakan format berikut di mana nama parameter masuk saya adalah scheduleDate.

Contoh:
https: // localhost / api / getScheduleForDate? ScheduleDate = 2003-11-21T01: 11: 11Z

Michael K
sumber