REST API ควรจะสามารถแปลงวันที่และเวลาเป็นเขตเวลาไคลเอนต์ที่เหมาะสมได้หรือไม่?


10

ในขณะที่ใช้ API ของเราปัญหาของวันที่และเวลาและเขตเวลาก็เกิดขึ้น

วันที่ทั้งหมดถูกปรับให้เป็น UTC ในฐานข้อมูล ปัจจุบันในแอปพลิเคชันที่ไม่ใช่ API ชุดข้อมูลทั้งหมดจะถูกแปลงตามการตั้งค่าของผู้ใช้ก่อนนำเสนอ

ตอนนี้มีคำถามเดียวกันสำหรับ API: API ควรจะสามารถคืนค่าวันที่และเวลาที่เหมาะสมสำหรับเขตเวลาตามความหมายของคำขอหรือไม่

เช่นGET /posts?timezone=America/Sao_Paulo?

หรือควรจะทำในสิ่งที่ลูกค้ากำลังเข้าถึง API?

อัปเดต:เนื่องจากมีการเกิดขึ้นสองสามครั้ง: เวลาปัจจุบันที่มีเขตเวลาจะถูกส่งคืน (แม้ว่าจะเป็นออฟเซ็ต TZ เสมอ+00:00) รูปแบบที่เป็นที่นิยม 8601:2015-10-29T23:00:49+00:00


หากคุณส่งคืนการประทับเวลาที่มีเขตเวลาไคลเอนต์สามารถแปลงเป็นเวลาท้องถิ่นตามที่ต้องการ อย่างไรก็ตามคำถามนี้ดูเหมือนจะไม่เกี่ยวข้องกับ REST เลย มีหลายวิธีที่คุณสามารถใช้สิ่งนี้ซึ่งไม่ละเมิดหลักการของ REST โปรดทราบว่าการเปิดเผยพารามิเตอร์นี้จะช่วยให้คุณทำงานได้มากขึ้น ในสถาปัตยกรรมที่สงบเงียบอย่างแท้จริงคุณจะต้องทำให้ลิงก์เหล่านี้สามารถค้นพบได้ มันทำให้ฉันกลายเป็นเรื่องซับซ้อนโดยไม่จำเป็นต้องใช้ทั้งในฝั่งไคลเอ็นต์และเซิร์ฟเวอร์
toniedzwiedz

> ทำให้ฉันมีความซับซ้อนโดยไม่จำเป็นต้องใช้ทั้งฝั่งไคลเอ็นต์และเซิร์ฟเวอร์ ขอบคุณสำหรับการเข้า!
ทำเครื่องหมาย

คำตอบ:


17

คุณควรกลับจุดที่แน่นอนในเวลาจากนั้นทุกคนสามารถ จำกัด เวลาที่จำเป็น ด้วย "การประทับเวลาสัมบูรณ์" ฉันหมายถึงการประทับเวลา UNIX หรือการประทับเวลาที่มนุษย์อ่านได้ซึ่งรวมถึงเขตเวลาในรูปแบบ ISO มาตรฐานที่ได้มาตรฐานเช่น "2007-04-05T14: 30Z" สิ่งนี้สามารถแปลงเป็นเขตเวลาท้องถิ่นโดยลูกค้าตามความจำเป็น

หากคุณต้องการยอมรับพารามิเตอร์เขตเวลาและ จำกัด เวลาให้เป็นเขตเวลานั้นเป็นเรื่องปกติ แต่คุณยังควรใช้การประทับเวลาสัมบูรณ์รวม เขตเวลาในการตอบกลับของคุณเช่น "2007-04-05T16: 30-02: 00" เนื่องจากค่านี้เหมือนกับค่าที่ไม่แปลก่อนหน้านี้จึงค่อนข้างน่าสงสัยว่าทำไมคุณต้องประสบปัญหาในการเสนอพารามิเตอร์นี้ รูปแบบการแสดงผลที่แน่นอนของการประทับเวลานั้นขึ้นอยู่กับส่วนหน้าของลูกค้าในที่สุดดังนั้นจึงมีแนวโน้มว่าจะดำเนินการกับค่าภายหลัง


4
"มันค่อนข้างน่าสงสัยว่าทำไมคุณต้องเจอปัญหา" - ถ้าไม่มีอะไรมันเป็นจุดจบของลิ่ม ลูกค้ารายต่อไปของ API นี้อาจขอให้คุณระบุstrftimeรูปแบบ (บวกตำแหน่งที่ตั้งสำหรับชื่อเดือน / วัน) ด้วยเหตุผลเดียวกันกับความสะดวกสบายที่ลูกค้ารายแรกพบว่ามีประโยชน์ในการระบุเขตเวลา แม้ว่าเขตเวลาจะเป็นเพียงสัมปทานเดียว แต่คุณก็ทำให้การตอบสนองของ API ของคุณซับซ้อนมากขึ้น: มันไม่ใช่แค่ "การประทับเวลาในรูปแบบเดียวกันทุกครั้ง" แต่มันคือ "การประทับเวลาที่แสดงออกมาในแบบที่ฉันถูกขอให้แสดง"
สตีฟ Jessop

3
ความซับซ้อนแน่นอน ความซับซ้อนเป็นสิ่งชั่วร้าย มันทำให้ทุกคนทำงานหนักขึ้นโดยไม่มีมูลค่าเพิ่มให้กับผลิตภัณฑ์หรือธุรกิจ ความตายโดยการตัดกระดาษพันครั้ง
Brandon

2
> คุณควรคืนจุดที่แน่นอนในเวลาที่ฉันชี้แจงคำถามของฉันว่าฉันกำลังทำสิ่งนี้อยู่ ขอบคุณสำหรับความเข้าใจของคุณ!
ทำเครื่องหมาย

4

หากคุณมีตรรกะในการแปลงค่าวันที่และเวลาเป็นเขตเวลาท้องถิ่นของผู้ใช้คุณสามารถเสนอความเป็นไปได้ทั้งใน API ของคุณ

หากลูกค้าทำคำขอเช่นGET /postsนั้นพวกเขาจะได้รับตลอดเวลาในเขตเวลาเริ่มต้น (UTC)
หากลูกค้าทำการร้องขอเช่นGET /posts?timezone=America/Sao_Paulนั้นเวลาทั้งหมดในการตอบกลับจะถูกปรับเป็นเขตเวลาที่ระบุ

มันขึ้นอยู่กับการใช้งานของลูกค้าว่าพวกเขาต้องการทำอะไรกับเขตเวลา


2

โดยปกติคุณคาดหวัง UTC จาก API

อย่างไรก็ตามหาก 'REST API' ของคุณเป็นเพียงส่วนหนึ่งของเซิร์ฟเวอร์ของหน้าเว็บโดยใช้กรอบงานจาวาสคริปต์ ฉันขอยืนยันว่าในความเป็นจริงคุณกำลังส่งคืน ViewModel และดังนั้นจึงควรมีสตริงตัวเลขและเวลาที่แปลเป็นภาษาท้องถิ่น


2

มันเป็นความคิดที่เลวร้ายเลวร้าย พิจารณาสถานการณ์ที่ลูกค้าเก็บการตอบสนองจากเซิร์ฟเวอร์จากนั้นผู้ใช้เดินทางไปยังเขตเวลาอื่น ตอนนี้คุณมีสถานการณ์ที่ "ฟีเจอร์" ที่ดีที่สุดจะไม่ให้ประโยชน์ใด ๆ หรือสร้างปัญหามหาศาล

BTW สำหรับเขตเวลากี่แห่งและจำนวนลูกค้าที่จะทดสอบนี้ หากเซิร์ฟเวอร์ให้การตอบกลับที่คาดหวังสำหรับ America / Sao_Paul มันจะตอบสนองอะไรกับ America / Sao_Paulo


America/Sao_Pauloนั่นเป็นความผิดพลาดในส่วนของฉันฉันจะแก้ไขมัน ฉันเดาว่าการอภิปรายจะเกิดอะไรขึ้นหากไม่สามารถระบุเขตเวลาได้ อาจเป็นเพราะมันผิดธรรมดาหรือฐานข้อมูล TZ ล้าสมัย (ฉันพบว่าไม่น่าจะเป็นไปได้สำหรับชื่อจริง [แต่ไม่ใช่สำหรับค่าออฟเซ็ต) อย่างไรก็ตามในทั้งสองกรณีฉันอาจ400 BAD_REQUESTตอบกลับ
ทำเครื่องหมาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.