การโทรแบบ REST PUT / POST / DELETE ใดที่ควรส่งคืนโดยการประชุม?


153
  1. ตาม "REST อุดมการณ์" สิ่งที่ควรอยู่ในเนื้อหาการตอบสนองสำหรับคำขอ PUT / POST / DELETE

  2. สิ่งที่เกี่ยวกับรหัสส่งคืน? คือHTTP_OKพอ?

  3. อะไรคือเหตุผลของการประชุมเช่นนั้นถ้ามี?

ฉันพบโพสต์ที่ดีที่อธิบายความแตกต่าง POST / PUT: POST เทียบกับ PUT แต่ก็ยังไม่ตอบคำถามของฉัน

คำตอบ:


130

ให้อภัยความผิดพลาด แต่ถ้าคุณกำลังทำ REST ผ่าน HTTP RFC7231 จะอธิบายถึงพฤติกรรมที่คาดหวังได้จาก GET, PUT, POST และ DELETE

อัปเดต (3 ก.ค. '14):
ข้อมูลจำเพาะ HTTP โดยเจตนาไม่ได้กำหนดสิ่งที่ส่งคืนจาก POST หรือ DELETE ข้อมูลจำเพาะจะกำหนดสิ่งที่จะต้องกำหนดเท่านั้น ส่วนที่เหลือจะขึ้นอยู่กับผู้ใช้งานเพื่อเลือก


9
@tuxslayer ฉันดีใจที่คุณไม่คิดว่าฉันแค่พยายามที่จะพูดอย่างขะมักเขม้น ดูเหมือนว่าหลายคนคิดว่า REST จะเพิ่มข้อกำหนดเพิ่มเติมนอกเหนือจากวิธีการ HTTP อย่างไรก็ตามนั่นไม่ใช่กรณี มีข้อ จำกัด เพิ่มเติม แต่ก็ไม่ได้ส่งผลกระทบต่อพฤติกรรมของวิธีการ HTTP RFC2616 เป็นแนวทางปฏิบัติที่แน่นอน
Darrel Miller

4
ฉันขอขอบคุณการเชื่อมโยง :) มันทำให้ฉันหยุดและคิดเกี่ยวกับเครื่องมือที่ฉันใช้ หลังจากอ่านโพสต์ของคุณและ RFC ฉันพบว่าตัวเองอ้างถึง RFC ตลอดทั้งคืน มันช่วยให้ฉันคิดว่ากระบวนการเป็นกระบวนการ HTTP ก่อนและกระบวนการที่เหลือเป็นครั้งที่สอง ชื่นชมมาก
Perry Tew

4
@PerryTew ตอนนี้คุณสามารถไปที่นี่tools.ietf.org/wg/httpbisและดู HTTP สเป็คที่แก้ไขในปัจจุบัน สนุก!
Darrel Miller

12
บางทีฉันอาจต้องการนอนเพิ่ม แต่ฉันไม่สามารถหาข้อมูลที่แน่นอนที่ OP ร้องขอภายใน RFC ร่างกายควรจะตอบสนองต่อ POST หรือ DELETE อย่างไร
Cam Jackson

9
นั่นเป็นเรื่องที่ชัดเจนเหมือนโคลน บางทีข้อมูลเพิ่มเติมในคำตอบอาจเป็นประโยชน์ โดยเฉพาะอย่างยิ่งเมื่อลิงค์นั้นตาย
Doug Molineux

25

โดยรวมแล้วการประชุมนั้น“ คิดเหมือนคุณกำลังส่งหน้าเว็บ”

สำหรับ PUT ฉันจะคืนค่ามุมมองเดิมที่คุณจะได้รับถ้าคุณได้รับทันทีหลังจากนั้น ที่จะส่งผลให้ 200 (ดีสมมติว่าการแสดงผลสำเร็จแน่นอน) สำหรับ POST ฉันจะทำการเปลี่ยนเส้นทางไปยังทรัพยากรที่สร้างขึ้น (สมมติว่าคุณกำลังดำเนินการสร้างถ้าไม่เพียงแค่ส่งคืนผลลัพธ์); รหัสสำหรับการสร้างที่ประสบความสำเร็จคือ 201 ซึ่งจริงๆแล้วเป็นรหัส HTTP เดียวสำหรับการเปลี่ยนเส้นทางที่ไม่ได้อยู่ในช่วง 300

ฉันไม่เคยมีความสุขกับสิ่งที่ DELETE ควรส่งคืน (ขณะนี้รหัสของฉันสร้าง HTTP 204 และเนื้อความว่างเปล่าในกรณีนี้)


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

1
@lobati ฉันคิดว่าเป็นเรื่องสำคัญที่จะต้องทราบว่าการส่งคำขอ PUT ที่เหมือนกันหลายรายการควรมีผลลัพธ์เดียวกันอย่างแม่นยำเช่นเดียวกับการส่งคำขอ PUT เดียวเท่านั้น บางทีปัญหาที่คุณเพิ่มขึ้นในตอนนี้มีความสำคัญน้อยกว่าที่ระบุข้างต้น
Iain

3
@ ฉันไม่ได้จริงๆ ปัญหาคือหากมีสิ่งใดที่ปรับปรุงบันทึกในภายหลังคุณไม่ต้องการให้ส่งPUTคำขออีกครั้งทำให้ข้อมูลเปลี่ยนกลับ ตัวอย่างเช่นหากคนสองคนกำลังอ้างถึงหน้าเดียวกันอีกคนหนึ่งทำการอัปเดตจากนั้นคนอื่นทำการอัปเดตหากคนแรกรีเฟรชเพื่อดูผลลัพธ์มันจะจบลงด้วยเหตุนี้สิ่งที่จะกลับไปเป็นจริงก่อนที่บุคคลที่สองจะสร้างขึ้น การเปลี่ยนแปลงของพวกเขา
lobati

"คิดเหมือนเว็บไซต์" นั้นสมบูรณ์แบบดังนั้นการลบอาจตอบสนองด้วยการกระทำต่อไปที่อาจเกิดขึ้นซึ่งขึ้นอยู่กับ "เรื่องราว" ซึ่งเป็นสาเหตุที่คุณจะลบทรัพยากร อย่างน้อยนี่อาจเป็นลิงก์ที่จะนำเอเจนต์กลับไปยังจุดเริ่มต้นของการดำเนินการทางตรรกะหรือแม้แต่การเปลี่ยนเส้นทางไปยังทรัพยากรสถานะที่แสดงผลกระทบของการลบ (ยอดรวมการสั่งซื้อ) และมีลิงก์เพิ่มเติม
ลุค Puplett

3

โดยทั่วไปการสร้างทรัพยากรจะถูกแมปกับ POST และควรส่งคืนตำแหน่งของทรัพยากรใหม่ ตัวอย่างเช่นในนั่งร้าน Rails CREATE จะเปลี่ยนเส้นทางไปยัง SHOW สำหรับทรัพยากรที่สร้างขึ้นใหม่ วิธีการเดียวกันอาจเหมาะสมสำหรับการอัปเดต (PUT) แต่นั่นเป็นเพียงข้อตกลงที่น้อยกว่า การอัปเดตจำเป็นต้องระบุถึงความสำเร็จเท่านั้น การลบอาจจำเป็นต้องระบุถึงความสำเร็จเท่านั้น หากคุณต้องการเปลี่ยนเส้นทางการส่งคืนรายการทรัพยากรอาจเหมาะสมที่สุด

HTTP_OK สามารถระบุความสำเร็จได้

กฎเดียวที่ยากและรวดเร็วในสิ่งที่ฉันได้กล่าวไว้ข้างต้นคือ CREATE ควรส่งคืนตำแหน่งของทรัพยากรใหม่ ดูเหมือนว่าจะเป็นเกมง่ายๆสำหรับฉัน มันทำให้รู้สึกที่สมบูรณ์แบบที่ลูกค้าจะต้องสามารถเข้าถึงรายการใหม่


2
คุณได้ผสม PUT และ POST เข้าด้วยกัน POST ใช้สำหรับสร้าง PUT ใช้สำหรับการอัปเดต (และสร้าง) นอกจากนี้ยังควรทราบว่า PUT ควรเป็น idempotent ในขณะที่ POST ไม่ใช่
Stevie

คำสั่ง idempotent ควรทำงานอย่างถูกต้องอย่างไรก็ตามคุณเรียกใช้หลายครั้ง ดังนั้นคุณควรทำ PUT เดียวกันหลาย ๆ ครั้งเพื่อใช้ "อัพเดท" เดียวกันโดยไม่มีผลข้างเคียงด้านลบใด ๆ
Jacob Mattison

1

โดย RFC7231 มันไม่สำคัญและอาจว่างเปล่า

วิธีที่เราใช้โซลูชันที่ยึดตามมาตรฐาน json api ในโครงการ:

โพสต์ / วาง: เอาท์พุทแอตทริบิวต์ของวัตถุในขณะที่รับ (ตัวกรองข้อมูล / ความสัมพันธ์ใช้เหมือนกัน)

ลบ: ข้อมูลมีเพียง null (สำหรับการเป็นตัวแทนของวัตถุที่หายไป)

สถานะสำหรับการลบมาตรฐาน: 200


0

ฉันชอบ Alfonso Tienda responce จาก รหัสสถานะ HTTP สำหรับการอัปเดตและลบหรือไม่

นี่คือเคล็ดลับบางอย่าง:

ลบ

  • 200 (ถ้าคุณต้องการส่งข้อมูลเพิ่มเติมในการตอบกลับ) หรือ204 (แนะนำ)

  • 202ปฏิบัติการที่ถูกลบยังไม่ได้รับการยืนยัน

  • หากไม่มีอะไรที่จะลบให้ใช้204 หรือ 404 (การดำเนินการ DELETE นั้นเป็น idempotent แล้วลบรายการที่ถูกลบแล้วไปแล้วว่าเป็นการดำเนินการที่ประสบความสำเร็จดังนั้นคุณสามารถส่งคืน204ได้ แต่มันเป็นความจริงที่ idempotent ไม่จำเป็น

ข้อผิดพลาดอื่น ๆ :

  • 400 คำขอไม่ถูกต้อง (ไวยากรณ์ผิดรูปแบบหรือแบบสอบถามไม่ถูกต้องเป็นเรื่องแปลกแต่เป็นไปได้)
  • 401 การ ตรวจสอบสิทธิ์โดยไม่ได้รับอนุญาตล้มเหลว
  • 403 ต้องห้าม : การอนุญาตล้มเหลวหรือรหัสแอปพลิเคชันไม่ถูกต้อง
  • 405 ไม่ได้รับอนุญาต แน่ใจ
  • 409 ความขัดแย้งของทรัพยากรสามารถเกิดขึ้นได้ในระบบที่ซับซ้อน
  • และ501 , 502ในกรณีที่มีข้อผิดพลาด

PUT

หากคุณกำลังปรับปรุงองค์ประกอบของคอลเลกชัน

  • 200/204ด้วยเหตุผลเดียวกับ DELETE ด้านบน
  • 202หากยังไม่ได้ส่งมอบปฏิบัติการ

องค์ประกอบที่อ้างอิงไม่มีอยู่:

  • PUT สามารถเป็น201 (ถ้าคุณสร้างองค์ประกอบเพราะนั่นเป็นพฤติกรรมของคุณ)

  • 404ถ้าคุณไม่ต้องการสร้างองค์ประกอบผ่าน PUT

  • 400 คำขอไม่ถูกต้อง (ไวยากรณ์ผิดรูปแบบหรือแบบสอบถามไม่ถูกต้องพบได้บ่อยกว่าในกรณีของ DELETE)

  • 401 ไม่ได้รับอนุญาต

  • 403 ต้องห้าม : การตรวจสอบล้มเหลวหรือรหัสแอปพลิเคชันไม่ถูกต้อง

  • 405 ไม่ได้รับอนุญาต แน่ใจ

  • ความขัดแย้งทรัพยากร409สามารถเกิดขึ้นได้ในระบบที่ซับซ้อนเช่นเดียวกับใน DELETE

  • 422 เอนทิตีที่ไม่สามารถประมวลผลได้ซึ่งช่วยแยกความแตกต่างระหว่าง "คำขอไม่ถูกต้อง" (เช่น XML / JSON ที่มีรูปแบบไม่ถูกต้อง) และค่าฟิลด์ที่ไม่ถูกต้อง

  • และ501 , 502ในกรณีที่มีข้อผิดพลาด

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