HTTP แยกความแตกต่างระหว่างสองคุณสมบัติ:
Idempotency ถูกกำหนดโดย spec ดังต่อไปนี้:
เมธอดยังสามารถมีคุณสมบัติของ " idempotence " ในนั้น (นอกเหนือจากข้อผิดพลาดหรือปัญหาการหมดอายุ) ผลข้างเคียงของN> 0คำขอที่เหมือนกันจะเหมือนกันสำหรับคำขอเดียว วิธีการGET
, HEAD
, PUT
และDELETE
แบ่งปันคุณสมบัตินี้ นอกจากนี้วิธีการOPTIONS
และTRACE
ไม่ควรมีผลข้างเคียงและดังนั้น idempotent โดยเนื้อแท้
และความปลอดภัย:
โดยเฉพาะอย่างยิ่งการประชุมได้รับการจัดตั้งขึ้นที่GET
และHEAD
วิธีการไม่ควรมีความสำคัญของการดำเนินการอื่นนอกเหนือจากการดึง วิธีการเหล่านี้ควรได้รับการพิจารณาว่า " ปลอดภัย " นี้จะช่วยให้ตัวแทนผู้ใช้เพื่อเป็นตัวแทนของวิธีการอื่น ๆ เช่นPOST
, PUT
และDELETE
ในวิธีพิเศษเพื่อให้ผู้ใช้จะได้รับรู้ถึงความจริงที่ว่าการกระทำที่อาจจะไม่ปลอดภัยมีการร้องขอ
ตามธรรมชาติแล้วมันเป็นไปไม่ได้ที่จะตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ไม่ได้สร้างผลข้างเคียงอันเป็นผลมาจากการดำเนินการGET
ตามคำขอ ในความเป็นจริงทรัพยากรแบบไดนามิกบางอย่างพิจารณาว่าเป็นคุณสมบัติ ความแตกต่างที่สำคัญที่นี่คือผู้ใช้ไม่ได้ร้องขอผลข้างเคียงดังนั้นจึงไม่สามารถรับผิดชอบได้
โปรดทราบว่าความปลอดภัยหมายถึง idempotency: หากวิธีการไม่มีผลข้างเคียงจากนั้นการดำเนินการหลายครั้งจะให้ผลข้างเคียงเช่นเดียวกับการทำเพียงครั้งเดียวคือไม่มี
สิ่งนี้ทำให้วิธีการเป็นสามประเภท:
- ปลอดภัย (และยัง idempotent):
GET
, HEAD
, OPTION
,TRACE
- idempotent แต่ไม่จำเป็นต้องปลอดภัย:
PUT
,DELETE
- idempotent และไม่ปลอดภัย:
POST
วางต้องไม่มีผลข้างเคียง
ว่าเป็นสิ่งที่ผิด. PUT
idempotent แต่ไม่ปลอดภัย จุดรวมของการPUT
ที่จะมีผลข้างเคียงคือการปรับปรุงทรัพยากร idempotency หมายความว่าการอัพเดตทรัพยากรเดียวกันด้วยเนื้อหาเดียวกันหลาย ๆ ครั้งควรมีผลเช่นเดียวกับการอัพเดตเพียงครั้งเดียว
จดบันทึกย่อหน้าสุดท้ายในส่วนเกี่ยวกับความปลอดภัย [เหมืองของการเน้น]
ตามธรรมชาติแล้วมันเป็นไปไม่ได้ที่จะตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ไม่ได้สร้างผลข้างเคียงอันเป็นผลมาจากการดำเนินการGET
ตามคำขอ ในความเป็นจริงทรัพยากรแบบไดนามิกบางอย่างพิจารณาว่าเป็นคุณสมบัติ ความแตกต่างที่สำคัญที่นี่คือผู้ใช้ไม่ได้ร้องขอผลข้างเคียงดังนั้นจึงไม่สามารถรับผิดชอบได้
แม้ว่าประโยคนี้จะพูดถึงGET
และปลอดภัย แต่เราสามารถสันนิษฐานได้ว่าผู้เขียนตั้งใจใช้เหตุผลเดียวกันกับPUT
idempotency IOW: PUT
ควรมีผลข้างเคียงที่ผู้ใช้เห็นได้เพียงครั้งเดียวนั่นคือการอัพเดตทรัพยากรที่มีชื่อ มันอาจมีผลข้างเคียงอื่น ๆ แต่ผู้ใช้ไม่สามารถรับผิดชอบต่อพวกเขา
ตัวอย่างเช่นความจริงที่ว่าPUT
idempotent หมายความว่าฉันสามารถลองใหม่ได้บ่อยเท่าที่ต้องการ: สเป็ครับประกันว่าการดำเนินการหลายครั้งจะเหมือนกับการดำเนินการเพียงครั้งเดียว สามารถใช้งานได้อย่างสมบูรณ์แบบในการสร้าง backlog ของการแก้ไขแบบเก่าซึ่งเป็นผลข้างเคียงของPUT
คำขอหลาย ๆ อย่างไรก็ตามหากเป็นผลมาจากการลองซ้ำหลายครั้งฐานข้อมูลของคุณจะเต็มไปด้วย backlog ของการแก้ไขเก่านั่นไม่ใช่ปัญหาของฉันมันเป็นของคุณ
IOW: คุณได้รับอนุญาตให้มีผลข้างเคียงได้มากเท่าที่คุณต้องการ แต่
- มันต้องมองไปที่ผู้ใช้ราวกับว่าคำขอของพวกเขานั้นเป็น idempotent
- คุณต้องรับผิดชอบต่อผลข้างเคียงเหล่านั้นไม่ใช่ผู้ใช้