Định dạng ngày được đề xuất cho REST GET API


105

Định dạng dấu thời gian được đề xuất cho API REST GET như thế này là gì:

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

Tôi nghĩ định dạng ngày thực tế phải là định dạng ISO 8601, chẳng hạn như YYYY-MM-DDThh:mm:ssZgiờ UTC.

Chúng ta có nên sử dụng phiên bản ISO 8601 không có dấu gạch ngang và dấu hai chấm, chẳng hạn như:

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

hay chúng ta nên mã hóa định dạng ISO 8601, sử dụng mã hóa base64 chẳng hạn?


Tại sao định dạng ISO 8601 không phải là một lựa chọn cho bạn?
Johannes

@ Johannes định dạng ISO 8601 (trong phiên bản mà không có dấu gạch nối và dấu hai chấm) sẽ là OK, tôi chỉ tự hỏi liệu có một loại phương pháp được đề nghị cho đại diện cho số ngày trong URL
Lorenzo Polidori

Câu trả lời:


77

REST không có định dạng ngày được đề xuất. Thực sự nó tóm tắt những gì hoạt động tốt nhất cho người dùng cuối và hệ thống của bạn. Cá nhân tôi muốn tuân theo tiêu chuẩn như bạn có cho ISO 8601 (được mã hóa url).

Nếu không có xấu xí URI là một mối quan tâm (ví dụ như không bao gồm các phiên bản được mã hóa url của :, -, trong bạn URI) và (con người) định địa chỉ không phải là quan trọng, bạn cũng có thể xem xét thời gian kỷ nguyên (ví dụ http://example.com/start/1331162374). URL trông gọn gàng hơn một chút, nhưng chắc chắn bạn sẽ mất khả năng đọc.

Đây /2012/03/07là một định dạng khác mà bạn thấy nhiều. Tôi cho rằng bạn có thể mở rộng điều đó. Nếu bạn đi theo tuyến đường này, chỉ cần đảm bảo rằng bạn luôn ở theo giờ GMT (và làm rõ điều đó trong tài liệu của bạn) hoặc bạn cũng có thể muốn bao gồm một số loại chỉ báo múi giờ.

Cuối cùng, nó tóm tắt những gì hoạt động cho API của bạn và người dùng cuối của bạn. API của bạn nên làm việc cho bạn, không phải cho bạn ;-).


12
Cảm ơn, câu trả lời rất hữu ích. Tôi nghĩ rằng tôi sẽ sử dụng phiên bản nén của ISO 8601 (tức là http://api.example.com/start_date/YYYYMMDDThhmmssZ) tốt cho khả năng đọc và URL sạch.
Lorenzo Polidori

7
Nhưng JSON không có một định dạng ngày đề nghị và đó là tiêu chuẩn ISO 8601 :)
Radu Potop

@stalemate Đối tượng ngày tháng theo mặc định tuần tự hóa thành một chuỗi chứa ngày tháng ở định dạng ISO. developer.mozilla.org/en-US/docs/JSON
Radu Potop

5
@RaduPotop Có, nhưng đây là tiêu chuẩn HTTP và URI mà chúng ta đang nói đến. Tôi không chắc JSON phải làm gì với nó.
nategood

3
Tôi chỉ muốn lưu ý rằng dấu gạch nối không cần phải được mã hóa URL.
user128216,

97

Kiểm tra bài viết này để biết 5 luật về ngày và giờ của API TẠI ĐÂY :

  • Luật # 1: Sử dụng ISO-8601 cho các ngày của bạn
  • Luật # 2: Chấp nhận mọi múi giờ
  • Luật # 3: Lưu trữ nó trong UTC
  • Luật # 4: Trả lại nó trong UTC
  • Luật # 5: Không sử dụng thời gian nếu bạn không cần thiết

Thông tin thêm trong tài liệu.


2
-1, vì 2017-11-20T11%3A00%3A00Znó không dễ đọc lắm. Ngoài ra (dành riêng cho IIS) dường như rất hoang tưởng về dấu hai chấm trong URL ngay cả khi chúng được mã hóa.
Iain

2
Liên kết này - agiletribe.wordpress.com/2015/06/10/jsonrest-api-handling-dates đề xuất kỷ nguyên số nguyên để tránh các vấn đề về khả năng đọc của con người có thể gặp phải với định dạng iso-8601. Hãy cho tôi biết nếu bạn có quan điểm khác.
Andy Dufresne

5
Lưu ý rằng dấu gạch ngang và dấu chấm không phải là ký tự dành riêng trong URL. Chỉ các dấu hai chấm yêu cầu mã hóa URL ( en.wikipedia.org/wiki/Percent-encoding ). Trong ISO-8601 ( en.wikipedia.org/wiki/ISO_8601 ) dấu gạch ngang là bắt buộc nhưng dấu hai chấm là tùy chọn. Vì vậy, các biến thể ISO-8601 chính xác để sử dụng trong URL là YYYY-MM-DDThhmmssZ và YYYY-MM-DDThhmmss.mmmZ nếu bạn cần độ chính xác cao hơn.
Bruce Adams

Một bài báo thường xuyên được liên kết và tranh luận nhiều. Mặc dù tôi đồng ý với việc lựa chọn định dạng có thể sắp xếp nếu nó phải là một chuỗi , nhưng dấu thời gian unix (mà bài viết thậm chí không thừa nhận) có mọi lợi ích đã nêu và hơn thế nữa. Cho đến khi trình bày, các vấn đề về múi giờ và tiết kiệm ánh sáng ban ngày (và các quyết định chính trị) thậm chí không tồn tại.
kaay

18

RFC6690 - Định dạng liên kết RESTful Envy (CoRE) Không nêu rõ ràng định dạng Ngày nên là gì trong phần 2. Định dạng liên kết nó trỏ đến RFC 3986. Điều này ngụ ý rằng khuyến nghị cho loại ngày trong RFC 3986 nên được sử dụng.

Về cơ bản RFC 3339 Ngày và Giờ trên Internet là tài liệu để xem xét cho biết:

định dạng ngày và giờ để sử dụng trong các giao thức Internet là một cấu hình của tiêu chuẩn ISO 8601 để biểu diễn ngày và giờ bằng lịch Gregory.

cái này tổng hợp thành: YYYY-MM-ddTHH: mm: ss.ss ± hh: mm

(ví dụ: 1937-01-01T12: 00: 27.87 + 00: 20)

Là đặt cược an toàn nhất.


12

Mọi trường datetime trong đầu vào / đầu ra cần phải ở định dạng UNIX / epoch . Điều này tránh nhầm lẫn giữa các nhà phát triển trên các mặt khác nhau của API.

Ưu điểm:

  • Định dạng Epoch không có múi giờ.
  • Epoch có một định dạng duy nhất (Unix time là một số có dấu).
  • Thời gian của kỷ nguyên không bị ảnh hưởng bởi tính năng tiết kiệm ánh sáng ban ngày.
  • Hầu hết các khung phụ trợ và tất cả các API ios / android bản địa đều hỗ trợ chuyển đổi kỷ nguyên.
  • Phần chuyển đổi giờ địa phương có thể được thực hiện hoàn toàn ở phía ứng dụng tùy thuộc vào cài đặt múi giờ của thiết bị / trình duyệt của người dùng.

Nhược điểm:

  • Xử lý bổ sung để chuyển đổi sang UTC để lưu trữ ở định dạng UTC trong cơ sở dữ liệu.
  • Khả năng đọc của đầu vào / đầu ra.
  • Khả năng đọc của GET URL.

Ghi chú:

  • Múi giờ là một vấn đề của lớp trình bày! Hầu hết mã của bạn không được xử lý theo múi giờ hoặc giờ địa phương, nó phải chạy theo thời gian Unix.
  • Nếu bạn muốn lưu trữ thời gian mà con người có thể đọc được (ví dụ: nhật ký), hãy cân nhắc lưu trữ nó cùng với thời gian Unix, không thay vì thời gian Unix.

1
Không thể đồng ý hơn.
Jorge.V

1
Điều duy nhất mà tôi muốn thêm vào điều này là xem xét ngay từ đầu liệu bạn có cần xem xét mili giây ở bất kỳ đâu trong hệ thống của mình hay không. Nếu vậy, hãy sử dụng phiên bản mili giây của nhãn thời gian Unix.
jamesjansson

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.