วิธีการร้องขอ PUT และ DELETE HTTP มีประโยชน์อย่างไร


91

ฉันได้อ่านสิ่งต่างๆมากมายเกี่ยวกับเรื่องนี้ แต่ไม่สามารถหาข้อสรุปในหัวข้อนี้ได้

แต่ฉันไม่เคยใช้เมธอด PUT หรือ DELETE HTTP Request แนวโน้มของฉันคือใช้ GET เมื่อสถิติของระบบ (แอปพลิเคชันหรือเว็บไซต์ของฉัน) อาจไม่ได้รับผลกระทบ (เช่นรายการผลิตภัณฑ์) และใช้ POST เมื่อได้รับผลกระทบ (สั่งซื้อ) มันไม่เพียงพอหรือฉันขาดอะไรไป?


2
PUT / DELETE นั้นง่ายกว่าในการเขียนโค้ด แต่ติดตั้งยากกว่า (ความปลอดภัยที่ชาญฉลาด - ไดเรกทอรี vhost / apache) ความเห็นที่ต่ำต้อยของฉัน ... คุณอยู่ได้โดยปราศจากสิ่งเหล่านั้น
Najzero

5
@Najzero ใช่ฉันมีความสุขมากถ้าไม่มีพวกเขา :) แต่ต้องการคำตอบว่าทำไมพวกเขาถึงอยู่ที่นั่น ?? ได้อ่านบางสิ่ง แต่ไม่สามารถ
รับมือได้

คำตอบ:


89

DELETE ใช้สำหรับการลบทรัพยากรการร้องขอ:

เมธอด DELETE ร้องขอให้เซิร์ฟเวอร์ต้นทางลบรีซอร์สที่ระบุโดย Request-URI วิธีนี้อาจถูกแทนที่โดยการแทรกแซงของมนุษย์ (หรือวิธีอื่น ๆ ) บนเซิร์ฟเวอร์ต้นทาง ลูกค้าไม่สามารถรับประกันได้ว่าการดำเนินการได้ดำเนินการแล้วแม้ว่ารหัสสถานะที่ส่งคืนจากเซิร์ฟเวอร์ต้นทางจะระบุว่าการดำเนินการเสร็จสมบูรณ์แล้ว ...

PUT ใช้สำหรับวางหรืออัปเดตทรัพยากรบนเซิร์ฟเวอร์:

เมธอด PUT ร้องขอให้เก็บเอนทิตีที่แนบมาภายใต้ Request-URI ที่ให้มา หาก Request-URI อ้างถึงรีซอร์สที่มีอยู่แล้วเอนทิตีที่แนบมาควรได้รับการพิจารณาว่าเป็นเวอร์ชันที่แก้ไขแล้วของเวอร์ชันที่อยู่บนเซิร์ฟเวอร์ต้นทาง หาก URI คำขอไม่ชี้ไปที่ทรัพยากรที่มีอยู่และ URI นั้นสามารถถูกกำหนดให้เป็นทรัพยากรใหม่โดยตัวแทนผู้ใช้ที่ร้องขอเซิร์ฟเวอร์ต้นทางสามารถสร้างทรัพยากรด้วย URI นั้น ...

สำหรับการเยี่ยมชมข้อมูลจำเพาะทั้งหมด:

เนื่องจากเบราว์เซอร์ปัจจุบันไม่รองรับคำกริยาอื่นใดนอกจาก POST และ GET ในรูปแบบ HTMLคุณจึงไม่สามารถใช้ HTTP ได้เต็มที่กับเบราว์เซอร์เหล่านี้ (คุณยังสามารถลักลอบส่งผ่าน JavaScript ได้) การขาดการสนับสนุนวิธีการเหล่านี้ในรูปแบบ HTML ทำให้ URI มีคำกริยาเช่นตัวอย่างเช่น

POST http://example.com/order/1/delete

หรือแย่กว่านั้น

POST http://example.com/deleteOrder/id/1

อุโมงค์ความหมาย CRUD อย่างมีประสิทธิภาพผ่าน HTTP แต่คำกริยาไม่เคยหมายถึงเป็นส่วนหนึ่งของ URI แต่ HTTP จัดเตรียมกลไกและความหมายให้กับ CRUD ทรัพยากร (เช่นคำสั่ง) ผ่านวิธี HTTP HTTP เป็นโปรโตคอลไม่ใช่แค่บริการอุโมงค์ข้อมูลบางอย่าง

ดังนั้นในการลบทรัพยากรบนเว็บเซิร์ฟเวอร์คุณต้องโทร

DELETE http://example.com/order/1

และเพื่ออัปเดตที่คุณต้องการ

PUT http://example.com/order/1

และจัดเตรียมการเป็นตัวแทนทรัพยากรที่อัปเดตในเนื้อความ PUT เพื่อให้เว็บเซิร์ฟเวอร์ใช้แล้ว

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

สำหรับรายละเอียดเพิ่มเติมโปรดไปที่:


7
เบราว์เซอร์สามารถส่ง PUT และ DELETE ด้วย JavaScript!
โจ

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

3
แน่นอนว่าไม่มีแบบฟอร์มออกแบบมาสำหรับ POST และ GET ที่อยู่ในการออกแบบ HTML ไม่เป็นความจริงที่จะบอกว่าไม่รองรับ PUT และ DELETE เบราว์เซอร์ใช้ HTML และ HTTP
โจ

@ โจเราอาจจะไม่มีคำจำกัดความเดียวกันว่า "รองรับ" แล้ว เบราว์เซอร์ส่วนใหญ่รองรับ JavaScript และใช่ JavaScript สามารถส่งคำขอ HTTP ได้ แต่ฉันยังต้องตั้งโปรแกรมนั้นผูกโค้ดกับองค์ประกอบ UI บางส่วนและส่งไปยังไคลเอนต์ก่อน
Gordon

4
เบราว์เซอร์จะแสดงหน้าว่างเว้นแต่คุณจะเขียน HTML ใช่บางทีเราอาจจะไม่เห็นด้วย ไม่เห็นด้วยก็โอเค!
โจ

26

การใช้คำกริยาคำขอ HTTP เช่น GET, POST, DELETE, PUT และอื่น ๆ ... ช่วยให้คุณสามารถสร้างแอปพลิเคชันเว็บที่ไม่พึงประสงค์ อ่านได้ที่นี่: http://en.wikipedia.org/wiki/Representational_state_transfer

วิธีที่ง่ายที่สุดในการดูประโยชน์จากสิ่งนี้คือดูตัวอย่างนี้ ทุกเฟรมเวิร์ก MVC มีRouter/Dispatcherที่แมป URL-s กับ actionControllers ดังนั้น URL เช่นนี้/blog/article/1จะเรียกใช้blogController::articleAction($id); ตอนนี้เราเตอร์นี้รับรู้เฉพาะ URL หรือ/blog/article/1/

แต่ถ้าเราเตอร์นั้นรับรู้ถึงอ็อบเจ็กต์ HTTP Request ทั้งหมดแทนที่จะเป็นเพียง URL เขาสามารถเข้าถึง HTTP Request verb (GET, POST, PUT, DELETE ... ) และสิ่งที่มีประโยชน์อื่น ๆ อีกมากมายเกี่ยวกับ HTTP Request ปัจจุบัน

ซึ่งจะช่วยให้คุณสามารถกำหนดค่าแอปพลิเคชันเพื่อให้สามารถยอมรับ URL เดียวกันและแมปกับ actionControllers ที่แตกต่างกันขึ้นอยู่กับคำกริยาคำขอ HTTP

ตัวอย่างเช่น:

หากคุณต้องการเรียกคืนบทความ 1 คุณสามารถทำได้:

GET /blog/article/1 HTTP/1.1

แต่ถ้าคุณต้องการลบบทความ 1 คุณจะทำสิ่งนี้:

DELETE /blog/article/1 HTTP/1.1

โปรดสังเกตว่าคำขอ HTTP ทั้งสองมี URI เดียวกัน / blog / article / 1 ข้อแตกต่างเพียงอย่างเดียวคือคำกริยาคำขอ HTTP และขึ้นอยู่กับกริยานั้นเราเตอร์ของคุณสามารถเรียกใช้ actionController ที่แตกต่างกัน สิ่งนี้ช่วยให้คุณสร้าง URL-s ที่เรียบร้อย

อ่านบทความสองบทความนี้อาจช่วยคุณได้:

Symfony 2 - พื้นฐาน HTTP

Symfony 2 - การกำหนดเส้นทาง

บทความเหล่านี้เกี่ยวกับเฟรมเวิร์ก Symfony 2 แต่สามารถช่วยให้คุณทราบได้ว่าคำขอและการตอบกลับ HTTP ทำงานอย่างไร

หวังว่านี่จะช่วยได้!


6
แม้ว่าฉันจะไม่ใช่เพื่อนของพวกเขา แต่ก็อธิบายได้ดี +1 ;-)
Najzero

1
คำตอบนี้อธิบายได้ดีที่สุดในการอธิบายความสำคัญของคำกริยา HTTP และสอดคล้องกับบริการ RESTful และประโยชน์ของมันอย่างแท้จริง หากคุณไม่ได้ใช้พูด HTTP ลบแล้วคุณอาจจะมี (2) การกระทำที่โพสต์ในควบคุม: 1 Createและ 1 Deleteสำหรับ หากคุณทำเช่นนี้การค้นหาถัดไปของคุณคือ " วิธีการมีการดำเนินการโพสต์หลายรายการในตัวควบคุมเดียว ": P. ไม่ใช่ว่าสิ่งนี้แย่มาก แต่คุณสูญเสียความสามารถในการมีทรัพยากรเฉพาะที่จะนำไปใช้ผ่านการกระทำของกริยาแทนที่จะต้องระบุชื่อการกระทำใน URI อย่างชัดเจน
atconway

4

ถึงแม้ว่าผมจะรับความเสี่ยงจากการไม่ได้รับความนิยมที่ผมบอกว่าพวกเขาไม่ได้มีประโยชน์ในปัจจุบัน

ฉันคิดว่าพวกเขาตั้งใจและมีประโยชน์ในอดีตเมื่อตัวอย่างเช่น DELETE บอกให้เซิร์ฟเวอร์ลบทรัพยากรที่พบใน URL ที่ให้มาและ PUT (ด้วย PATCH พี่น้อง) บอกให้เซิร์ฟเวอร์ทำการอัปเดตในลักษณะที่ไม่เหมาะสม

สิ่งต่างๆพัฒนาขึ้นและ URL กลายเป็นเสมือน (ดูตัวอย่างการเขียน URL ใหม่ ) ทำให้ทรัพยากรสูญเสียความหมายเริ่มต้นของโฟลเดอร์ / ลำดับย่อย / ไฟล์จริงคำกริยาการกระทำ CRUD ที่ครอบคลุมโดยวิธีโปรโตคอล HTTP (GET, POST, PUT / PATCH, DELETE) สูญเสียการติดตาม .

ลองดูตัวอย่าง:

  • / api / entity / list / {id}เทียบกับGET / api / entity / {id}
  • / api / entity / add / {id}เทียบกับPOST / api / entity
  • / api / entity / edit / {id}เทียบกับPUT / api / entity / {id}
  • / api / entity / delete / {id}เทียบกับDELETE / api / entity / {id}

ทางด้านซ้ายไม่ได้เขียนวิธี HTTP โดยพื้นฐานแล้วไม่สำคัญ (POST และ GET เพียงพอแล้ว) และใช้วิธี HTTP ที่เหมาะสมทางด้านขวา

ด้านขวาดูหรูหราสะอาดตาและเป็นมืออาชีพ ลองนึกภาพตอนนี้คุณต้องรักษารหัสที่ใช้ API ที่สวยงามและคุณต้องค้นหาว่าการเรียกลบเสร็จสิ้น คุณจะค้นหา"api / entity"จากนั้นคุณจะต้องดูว่ารายการใดกำลังดำเนินการ DELETE หรือที่แย่กว่านั้นคือคุณมีโปรแกรมเมอร์รุ่นเยาว์ซึ่งเปลี่ยน PUT ด้วย DELETE โดยไม่ได้ตั้งใจและเนื่องจาก URL ก็เกิดเรื่องเดียวกัน

ในความคิดของฉันการใส่คำกริยาการกระทำใน URL มีข้อดีกว่าการใช้วิธี HTTP ที่เหมาะสมสำหรับการกระทำนั้นแม้ว่ามันจะไม่สวยหรูก็ตาม หากคุณต้องการดูว่าการโทรลบเกิดขึ้นที่ใดคุณเพียงแค่ค้นหา"api / entity / delete"และคุณจะพบได้ทันที

การสร้าง API โดยไม่มีเมธอด HTTP อาร์เรย์ทั้งหมดทำให้ง่ายต่อการบริโภคและบำรุงรักษาในภายหลัง


1

วิธีการที่ปลอดภัย: รับทรัพยากร / ไม่มีการแก้ไขในทรัพยากร
Idempotent:ไม่มีการเปลี่ยนแปลงสถานะทรัพยากรหากมีการร้องขอหลายครั้ง
วิธีการที่ไม่ปลอดภัย:สร้างหรืออัปเดตทรัพยากร / การปรับเปลี่ยนในทรัพยากรที่
ไม่ได้ใช้งาน:เปลี่ยนสถานะทรัพยากรหากมีการร้องขอหลายครั้ง

ตามความต้องการของคุณ:

1) เพื่อความปลอดภัยและการดำเนินการที่ไม่เหมาะสม (Fetch Resource) ให้ใช้ --------- รับวิธีการ
2) สำหรับการดำเนินการที่ไม่ปลอดภัยและไม่เกิดประโยชน์ (แทรกทรัพยากร) ให้ใช้ --------- วิธีการโพสต์
3) สำหรับการดำเนินการที่ไม่ปลอดภัยและไม่เหมาะสม (Update Resource) ให้ใช้ --------- PUT METHOD
3) สำหรับการดำเนินการที่ไม่ปลอดภัยและไม่เหมาะสม (ลบทรัพยากร) ให้ใช้ --------- DELETE METHOD

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.