ความแรงของ Idem
ตาม RFC, PUT จะต้องส่งมอบออบเจ็กต์เต็มไปยังทรัพยากร เหตุผลหลักของเรื่องนี้ก็คือ PUT ควรเป็น idempotent ซึ่งหมายความว่าคำขอที่ทำซ้ำควรประเมินผลลัพธ์เดียวกันบนเซิร์ฟเวอร์
หากคุณอนุญาตการอัปเดตบางส่วนจะไม่สามารถใช้งานได้อีกต่อไป หากคุณมีลูกค้าสองราย ลูกค้า A และ B จากนั้นสถานการณ์จำลองต่อไปนี้สามารถพัฒนาได้:
ไคลเอ็นต์ A รับรูปภาพจากอิมเมจทรัพยากร สิ่งนี้มีคำอธิบายของภาพซึ่งยังคงใช้ได้ ไคลเอนต์ B สร้างอิมเมจใหม่และอัพเดตคำอธิบายตามนั้น รูปภาพมีการเปลี่ยนแปลง เห็นลูกค้าเขาไม่จำเป็นต้องเปลี่ยนคำอธิบายเพราะมันเป็นตามที่เขาต้องการและใส่ภาพเท่านั้น
สิ่งนี้จะนำไปสู่ความไม่สอดคล้องกันของภาพมีการแนบข้อมูลเมตาที่ไม่ถูกต้อง!
ที่น่ารำคาญยิ่งกว่าคือคนกลางใด ๆ ที่สามารถทำซ้ำการร้องขอ ในกรณีที่ตัดสินใจอย่างใดอย่างหนึ่งล้มเหลว
ความหมายของ PUT ไม่สามารถเปลี่ยนแปลงได้ (แม้ว่าคุณจะใช้ผิดวัตถุประสงค์)
ตัวเลือกอื่น
โชคดีที่มีตัวเลือกอื่นนี่คือแพทช์ PATCH เป็นวิธีการที่ช่วยให้คุณสามารถปรับปรุงโครงสร้างบางส่วนได้ คุณสามารถส่งโครงสร้างบางส่วนได้ สำหรับการใช้งานที่เรียบง่ายนี่เป็นสิ่งที่ดี วิธีการนี้ไม่รับประกันว่าจะมีประสิทธิภาพ ลูกค้าควรส่งคำขอในแบบฟอร์มต่อไปนี้:
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
และเซิร์ฟเวอร์สามารถตอบกลับด้วย 204 (ไม่มีเนื้อหา) เพื่อตั้งค่าสถานะความสำเร็จ ในข้อผิดพลาดคุณไม่สามารถอัปเดตส่วนหนึ่งของโครงสร้างได้ วิธีการแพทช์เป็นอะตอม
ข้อเสียของวิธีนี้คือเบราว์เซอร์บางตัวไม่รองรับสิ่งนี้ แต่นี่เป็นตัวเลือกที่เป็นธรรมชาติที่สุดใน REST-service
ตัวอย่างคำขอการแก้ไข:
http://tools.ietf.org/html/rfc5789#section-2.1
การปะ Json
ดูเหมือนว่าตัวเลือก json นั้นค่อนข้างครอบคลุมและเป็นตัวเลือกที่น่าสนใจ แต่มันอาจเป็นเรื่องยากที่จะใช้สำหรับบุคคลที่สาม คุณต้องตัดสินใจว่าฐานผู้ใช้ของคุณสามารถจัดการกับสิ่งนี้ได้หรือไม่
มันค่อนข้างซับซ้อนเช่นกันเนื่องจากคุณจำเป็นต้องสร้างล่ามขนาดเล็กซึ่งแปลงคำสั่งเป็นโครงสร้างบางส่วนซึ่งคุณจะใช้เพื่ออัปเดตโมเดลของคุณ ล่ามนี้ควรตรวจสอบด้วยหากคำสั่งที่ให้มาเหมาะสม คำสั่งบางคำสั่งยกเลิกซึ่งกันและกัน (เขียน fielda ลบ fielda) ฉันคิดว่าคุณต้องการรายงานเรื่องนี้กลับไปยังลูกค้าเพื่อ จำกัด เวลาแก้ไขข้อบกพร่องทางด้านของเขา / เธอ
แต่ถ้าคุณมีเวลานี่เป็นทางออกที่สง่างามจริงๆ คุณควรตรวจสอบความถูกต้องของฟิลด์ต่างๆ คุณสามารถรวมสิ่งนี้กับวิธี PATCH เพื่ออยู่ในรูปแบบ REST แต่ฉันคิดว่า POST น่าจะยอมรับได้ที่นี่
จะไม่ดี
หากคุณตัดสินใจที่จะไปกับตัวเลือก PUT ซึ่งค่อนข้างเสี่ยง อย่างน้อยคุณควรจะไม่ทิ้งข้อผิดพลาด ผู้ใช้มีความคาดหวังบางอย่าง (ข้อมูลจะได้รับการอัปเดต) และถ้าคุณทำสิ่งนี้ได้คุณจะให้นักพัฒนาบางคนไม่ได้มีเวลาที่ดี
คุณสามารถเลือกสำหรับการตั้งค่าสถานะกลับ: 409 ความขัดแย้งหรือ 403 ต้องห้าม ขึ้นอยู่กับว่าคุณดูกระบวนการอัพเดตอย่างไร หากคุณเห็นว่ามันเป็นชุดของกฎ (ระบบเป็นศูนย์กลาง) ความขัดแย้งจะดีกว่า บางอย่างเช่นฟิลด์เหล่านี้ไม่สามารถอัปเดตได้ (ขัดแย้งกับกฎ) หากคุณเห็นว่ามันเป็นปัญหาการอนุญาต (ผู้ใช้เป็นศูนย์กลาง) จากนั้นคุณควรกลับห้าม ด้วย: คุณไม่ได้รับอนุญาตให้เปลี่ยนฟิลด์เหล่านี้
คุณยังควรบังคับให้ผู้ใช้ส่งฟิลด์ที่แก้ไขได้ทั้งหมด
ตัวเลือกที่เหมาะสมในการบังคับใช้สิ่งนี้คือการตั้งค่าให้เป็นทรัพยากรย่อยซึ่งให้ข้อมูลที่แก้ไขได้เท่านั้น
ความเห็นส่วนตัว
โดยส่วนตัวแล้วฉันจะไป (ถ้าคุณไม่ต้องทำงานกับเบราว์เซอร์) สำหรับโมเดล PATCH แบบง่าย ๆ และต่อมาก็ขยายด้วยโปรเซสเซอร์แพตช์ JSON สิ่งนี้สามารถทำได้โดยการแยกความแตกต่างบน mimetypes: ชนิด mime ของ json patch:
แอพลิเคชัน / JSON แพทช์
และ json: application / json-patch
ทำให้ง่ายต่อการใช้งานในสองขั้นตอน