วิธี HTTP ใดที่ตรงกับวิธี CRUD ใด


213

ในการเขียนโปรแกรมสไตล์ RESTful เราควรใช้วิธี HTTP เป็นหน่วยการสร้างของเรา ฉันสับสนเล็กน้อยว่าวิธีการใดที่ตรงกับวิธีการ CRUD แบบดั้งเดิม GET / Read และ DELETE / Delete นั้นชัดเจนเพียงพอ

อย่างไรก็ตามความแตกต่างระหว่าง PUT / POST คืออะไร พวกเขาตรงกับหนึ่งต่อหนึ่งกับสร้างและปรับปรุง?

คำตอบ:


298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT สามารถแมปได้ทั้งสร้างและอัปเดตทั้งนี้ขึ้นอยู่กับการมีอยู่ของ URI ที่ใช้กับ PUT

แผนที่ POST เพื่อสร้าง

การแก้ไข: POST ยังสามารถแมปไปยังอัปเดตแม้ว่าโดยทั่วไปจะใช้สำหรับสร้าง POST อาจเป็นการอัพเดทบางส่วนดังนั้นเราจึงไม่จำเป็นต้องใช้วิธี PATCH ที่เสนอ


16
+1: ความแตกต่างที่คุณทำระหว่าง PUT เพื่อสร้างทรัพยากรที่ชื่อ (URIs) ถูกกำหนดโดยไคลเอนต์และ POST เพื่อสร้างทรัพยากรที่มีชื่อที่เซิร์ฟเวอร์กำหนดให้เป็นสิ่งสำคัญ ดูบริการเว็บ Restful Web Service (O'Reilly) ของ Richardson และ Ruby
Jim Ferrans

9
และเนื่องจาก PUT และ DELETE ยังไม่ได้รับการสนับสนุนจากเว็บเบราว์เซอร์จึงถือว่าเป็นการ "เกินพิกัด POST" โดยการเพิ่มอาร์กิวเมนต์สตริงแบบสอบถามเช่น method = PUT หรือ method = DELETE บน URI ที่ถูกโพสต์
Jim Ferrans

2
Nice วิเคราะห์jcalcote.wordpress.com/2008/10/16/…
Boris Ivanov

13
@JimFerrans PUT และ DELETE ได้รับการสนับสนุนโดยเว็บเบราว์เซอร์ที่ใช้ได้ XHR อย่างไรก็ตามในบริบทของรูปแบบ HTML สเปค HTML ไม่รองรับดังนั้นเบราว์เซอร์จึงไม่สามารถทำได้
eis

3
ในขณะที่ไม่ canonically ทำแผนที่ไปยังตัวอักษรใน CRUD เป็นจำนวนมากของกรอบ REST ยังใช้ GET / นิติบุคคล / เพื่อรายการหน่วยงานประเภทนิติบุคคล GET / นิติบุคคล / ID จะอ่านนิติบุคคลโดยเฉพาะอย่างยิ่งการจับคู่รหัส
Toddius Zho

49

คีย์ทั้งหมดคือไม่ว่าคุณจะทำการเปลี่ยนแปลงidempotentหรือไม่ นั่นคือถ้าการดำเนินการกับข้อความสองครั้งจะส่งผลให้สิ่ง "เดียวกัน" อยู่ที่นั่นราวกับว่ามันทำเพียงครั้งเดียวคุณมีการเปลี่ยนแปลง idempotent และควรแมปไปยัง PUT ถ้าไม่ทำเช่นนั้นจะจับคู่กับ POST หากคุณไม่อนุญาตให้ลูกค้าสังเคราะห์ URL นั้น PUT นั้นค่อนข้างใกล้เคียงกับ Update และ POST สามารถจัดการสร้างได้ดี แต่แน่นอนว่าไม่ใช่วิธีเดียวที่จะทำได้ ถ้าลูกค้ารู้ว่ามันต้องการสร้าง/foo/abcและรู้ว่าเนื้อหาที่จะนำไปที่นั่นมันทำงานได้ดีเหมือน PUT

คำอธิบายที่ยอมรับได้ของ POST คือเมื่อคุณมุ่งมั่นที่จะซื้อบางสิ่งนั่นคือการกระทำที่ไม่มีใครต้องการทำซ้ำโดยไม่รู้ตัว ในทางตรงกันข้ามการตั้งค่าที่อยู่การจัดส่งสำหรับการสั่งซื้อล่วงหน้าสามารถทำได้ด้วย PUT ได้ดี: ไม่สำคัญว่าคุณจะถูกบอกให้ส่ง6 Anywhere Dr, Nowherevilleครั้งเดียวสองครั้งหรือหนึ่งร้อยครั้ง: ยังคงเป็นที่อยู่เดิม นั่นหมายความว่าเป็นการอัปเดตหรือไม่ อาจเป็น ... ทุกอย่างขึ้นอยู่กับว่าคุณต้องการเขียนส่วนหลัง (โปรดทราบว่าผลลัพธ์อาจไม่เหมือนกัน: คุณสามารถรายงานกลับไปยังผู้ใช้เมื่อพวกเขาทำ PUT ครั้งล่าสุดซึ่งเป็นส่วนหนึ่งของการเป็นตัวแทนของทรัพยากรซึ่งจะทำให้แน่ใจว่า PUT ที่ทำซ้ำไม่ก่อให้เกิดผลลัพธ์ที่เหมือนกัน แต่ผลลัพธ์จะยังคง “ เหมือนกัน” ในแง่ของการใช้งาน)


1
ความแตกต่างระหว่างกรณีการใช้งานสำหรับPOSTและPUTเป็นสิ่งที่น่าสนใจและควรให้คำตอบว่า "อันไหนคือ" สร้าง "และ" อัพเดต "อันไหน? ชัดเจนยิ่งขึ้น เพิ่มเติมเกี่ยวกับการดำเนินการตาม API มันจะตามมาด้วยว่าการทำซ้ำPUTควรมีจำนวนที่ไม่มีการเงียบในขณะที่การทำซ้ำPOSTอาจทำให้เกิดข้อยกเว้นหากบางแง่มุมของข้อมูลที่ถูกส่งนั้นควรจะไม่ซ้ำกันในแหล่งข้อมูล ที่สำรองแอปพลิเคชัน
zerobandwidth

2
คำตอบและความคิดเห็นต่อไปนี้ยกประเด็นสำคัญควรใช้ความระมัดระวังในการคำนวณ CRUD ให้ใกล้เคียงกับ (1 ถึง 1) ด้วยความหมาย HTTP REST นี่ไม่ใช่การแม็พแบบบัญญัติ
Martin Spamer

35

ฉันค้นหาคำตอบเดียวกันนี่คือสิ่งที่ IBM พูด IBM Link

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.

10

ตอนนี้ (2016) คำกริยา HTTP ล่าสุดคือ GET, POST, PATCH , PUT และ DELETE

ภาพรวม

  • HTTP GET - เลือก / ร้องขอ
  • HTTP PUT - อัปเดต
  • HTTP POST - INSERT / สร้าง
  • HTTP PATCH - เมื่อPUTการแสดงทรัพยากรที่สมบูรณ์นั้นยุ่งยากและใช้แบนด์วิดท์ที่มากขึ้นเช่น: เมื่อคุณต้องอัปเดตคอลัมน์บางส่วน
  • HTTP DELETE - DELETE

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

หากคุณสนใจที่จะออกแบบ REST APIs นี่เป็นการอ่านที่น่าสนใจ เว็บไซต์ที่เก็บ github เวอร์ชั่นออนไลน์


1
ตั้งแต่วันที่ 18 ก.พ. โปรดทราบว่า PATCH ไม่ได้นำไปใช้อย่างละเอียดในไคลเอนต์และเซิร์ฟเวอร์ไลบรารี
Dizzley

โอ้ ok ขอบคุณฉันเห็น ... คุณจะโพสต์ลิงค์ / การอ้างอิงเพื่อที่ฉันจะได้โปรดดู?
d1jhoni1b

9

มีการพูดคุยผ่านวิดีโอ youtube ที่ยอดเยี่ยมโดย stormpath พร้อมคำอธิบายนี้จริง ๆ แล้ว URL ควรข้ามไปยังส่วนที่ถูกต้องของวิดีโอ:

วิดีโอ youtube Stormpath

นอกจากนี้ยังมีมูลค่าดูมันมากกว่าชั่วโมงของการพูดคุย แต่รบกวนมากถ้าคุณคิดว่าการลงทุนเวลาในการสร้าง api ส่วนที่เหลือ


7

มันขึ้นอยู่กับสถานการณ์ที่เป็นรูปธรรม .. แต่โดยทั่วไป:

PUT = อัพเดตหรือเปลี่ยนทรัพยากรที่เป็นรูปธรรมด้วย URI ที่เป็นรูปธรรมของทรัพยากร

POST = สร้างทรัพยากรใหม่ภายใต้แหล่งที่มาของ URI ที่กำหนด

กล่าวคือ

แก้ไขโพสต์บล็อก:

PUT: / บล็อก / รายการ / 1

สร้างใหม่:

โพสต์: / บล็อก / รายการ

PUT อาจสร้างทรัพยากรใหม่ในบางสถานการณ์ที่ URI ของแหล่งข้อมูลใหม่ชัดเจนก่อนการร้องขอ POST สามารถนำไปใช้กับกรณีการใช้งานอื่น ๆ ได้อีกด้วยเช่นกันซึ่งไม่ครอบคลุมโดยเคสอื่น ๆ (GET, PUT, DELETE, HEAD, OPTIONS)

ความเข้าใจทั่วไปสำหรับระบบ CRUD คือ GET = request, POST = create, Put = update, DELETE = delete


4

Building Block ของ REST ส่วนใหญ่เป็นทรัพยากร (และ URI) และสื่อสิ่งพิมพ์ ในบริบทนี้GETเป็นวิธีที่จะได้รับการเป็นตัวแทนของทรัพยากร (ซึ่งแน่นอนสามารถแมปกับSELECTในเงื่อนไข CRUD)

อย่างไรก็ตามคุณไม่ควรคาดหวังการแมปแบบหนึ่งต่อหนึ่งระหว่างการดำเนินการ CRUD และกริยา HTTP ความแตกต่างที่สำคัญระหว่างPUTและPOSTเป็นเรื่องเกี่ยวกับคุณสมบัติของ idempotent POSTยังใช้กันโดยทั่วไปสำหรับการอัพเดทบางส่วนตามPUTปกติแล้วหมายถึงการส่งการแสดงใหม่แบบเต็มของทรัพยากร

ฉันขอแนะนำให้อ่านสิ่งนี้:

จำเพาะ HTTPนอกจากนี้ยังมีการอ้างอิงที่มีประโยชน์:

วิธี PUT ร้องขอให้เก็บเอนทิตีที่ถูกล้อมไว้ภายใต้ Request-URI ที่ให้มา

[ ... ]

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


3

โดยทั่วไปแล้วนี่เป็นรูปแบบที่ฉันใช้:

  • HTTP GET - เลือก / ร้องขอ
  • HTTP PUT - อัปเดต
  • HTTP POST - INSERT / สร้าง
  • HTTP DELETE - DELETE

5
PUT และ POST ไม่ตรงกันกับทั้ง Update หรือ Create PUT คือ“ set” (เช่นที่คุณทราบชื่อทรัพยากรล่วงหน้าและให้คุณค่าแก่การใช้งาน) และ POST เป็นทุกอย่าง กุญแจสำคัญคือการคิดว่าสิ่งที่คุณกำลังทำคือidempotentหรือไม่
Donal Fellows

1
+1 ในความคิดเห็น ข้อสันนิษฐานของการจับคู่แบบสัมบูรณ์ระหว่างสองสิ่งนี้อาจทำให้เข้าใจผิด การดำเนินการ HTTP DELETE ให้กับ URI บางตัวอย่างอาจแก้ไข (เช่น UPDATE) เรคคอร์ดฝั่งเซิร์ฟเวอร์เพื่อให้การดำเนินการ HTTP GET ไม่ส่งคืนการแสดงอีกต่อไป
ยืน

4
PUT และ POST ไม่ตรงกับอย่างใดอย่างหนึ่ง Update หรือสร้าง จริง แต่ AJ อธิบายว่าเขาใช้รูปแบบใด
Piotr Dobrogost

1

Symfonyพยายามโครงการเพื่อให้วิธีการ HTTP ของตนเข้าร่วมกับวิธีการ CRUD และรายการของพวกเขาร่วมงานกับพวกเขาดังนี้

  • รับดึงทรัพยากรจากเซิร์ฟเวอร์
  • POST สร้างทรัพยากรบนเซิร์ฟเวอร์
  • วางอัพเดตทรัพยากรบนเซิร์ฟเวอร์
  • ลบลบทรัพยากรจากเซิร์ฟเวอร์

มันน่าสังเกตว่าอย่างที่พวกเขาพูดในหน้านั้น "อันที่จริงเบราว์เซอร์สมัยใหม่จำนวนมากไม่สนับสนุนวิธีการ PUT และ DELETE"

จากสิ่งที่ฉันจำได้ Symfony "fakes" PUT และ DELETE สำหรับเบราว์เซอร์ที่ไม่สนับสนุนเมื่อสร้างฟอร์มเพื่อให้ใกล้เคียงกับการใช้วิธี HTTP ที่ถูกต้องตามหลักเหตุผลแม้ว่าเบราว์เซอร์จะไม่สนับสนุน มัน.

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