ฉันสงสัยว่าความคิดเห็นของผู้คนเป็นอย่างไรเมื่อมีการPUT
ดำเนินการที่สงบซึ่งไม่ได้ผลตอบแทนใด ๆ ในการตอบสนอง
ฉันสงสัยว่าความคิดเห็นของผู้คนเป็นอย่างไรเมื่อมีการPUT
ดำเนินการที่สงบซึ่งไม่ได้ผลตอบแทนใด ๆ ในการตอบสนอง
คำตอบ:
ข้อมูลจำเพาะ HTTP ( RFC 2616 ) มีคำแนะนำจำนวนมากที่สามารถใช้ได้ นี่คือการตีความของฉัน:
200 OK
สำหรับ PUT ที่สำเร็จของการอัพเดตเป็นทรัพยากรที่มีอยู่ ไม่ต้องมีการตอบสนองใด ๆ (ต่อมาตรา 9.6 , 204 No Content
แม้จะเหมาะสมกว่า.)201 Created
สำหรับ PUT ที่ประสบความสำเร็จของทรัพยากรใหม่โดยเฉพาะ URI ที่เฉพาะเจาะจงที่สุดสำหรับทรัพยากรใหม่ที่ส่งคืนในฟิลด์ส่วนหัวสถานที่ตั้งและ URI อื่น ๆ ที่เกี่ยวข้องและข้อมูลเมตาของทรัพยากรที่สะท้อนในเนื้อหาการตอบสนอง ( RFC 2616 มาตรา 10.2.2 )409 Conflict
สำหรับใส่ที่ไม่ประสบความสำเร็จเนื่องจากมี 3 ถปรับเปลี่ยนของบุคคลที่มีรายชื่อของความแตกต่างระหว่างการปรับปรุงความพยายามและทรัพยากรในปัจจุบันในร่างกายตอบสนองได้ ( RFC 2616 มาตรา 10.4.10 )400 Bad Request
สำหรับ PUT ที่ไม่สำเร็จพร้อมข้อความภาษาธรรมชาติ (เช่นอังกฤษ) ในเนื้อความการตอบสนองที่อธิบายสาเหตุที่ PUT ล้มเหลว ( RFC 2616 มาตรา 10.4 )No response body needed
ในข้อที่ 9.6 เมื่อเทียบกับ 200 ในความเป็นจริงหน่วยการตอบสนองไม่ได้กล่าวถึง PUT เพียงระบุIf an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request.
ตรงข้ามกับคำตอบส่วนใหญ่ที่นี่ฉันคิดว่า PUT ควรส่งคืนทรัพยากรที่อัปเดต (นอกเหนือจากรหัส HTTP ของหลักสูตร)
สาเหตุที่คุณต้องการส่งคืนทรัพยากรเนื่องจากการตอบสนองสำหรับการดำเนินการ PUT เนื่องจากเมื่อคุณส่งการแสดงทรัพยากรไปยังเซิร์ฟเวอร์เซิร์ฟเวอร์ยังสามารถใช้การประมวลผลบางอย่างกับทรัพยากรนี้ได้ดังนั้นลูกค้าต้องการทราบว่าทรัพยากรนี้ทำอย่างไร ดูหลังจากคำขอเสร็จสมบูรณ์ (ไม่เช่นนั้นจะต้องออกคำขอ GET อื่น)
ฉันคิดว่าเป็นไปได้ที่เซิร์ฟเวอร์จะส่งคืนเนื้อหาตามการตอบกลับ PUT หากคุณใช้รูปแบบห่อหุ้มการตอบสนองที่ช่วยให้ข้อมูลไซด์โหลด (เช่นรูปแบบที่ใช้โดยข้อมูล ember) จากนั้นคุณสามารถรวมวัตถุอื่น ๆ ที่อาจได้รับการแก้ไขผ่านทริกเกอร์ฐานข้อมูล ฯลฯ (ข้อมูล Sideloaded จะลดลงอย่างชัดเจน # คำขอและนี่เป็นสถานที่ที่เหมาะสำหรับการเพิ่มประสิทธิภาพ)
ถ้าฉันยอมรับ PUT และไม่มีอะไรจะรายงานกลับฉันใช้รหัสสถานะ 204 โดยไม่มีเนื้อหา หากฉันมีสิ่งที่ต้องรายงานฉันใช้รหัสสถานะ 200 และรวมเนื้อหา
HTTP / 1.1 สเปค (มาตรา 9.6) กล่าวถึงรหัสที่เหมาะสมตอบสนอง / ข้อผิดพลาด อย่างไรก็ตามมันไม่ได้อยู่ที่เนื้อหาการตอบสนอง
คุณคาดหวังอะไร รหัสตอบกลับ HTTP แบบง่าย (200 เป็นต้น) ดูเหมือนจะตรงไปตรงมาและชัดเจนสำหรับฉัน
หากแบ็คเอนด์ของ REST API เป็นฐานข้อมูลเชิงสัมพันธ์ของ SQL ดังนั้น
หากคุณไม่สนใจเกี่ยวกับการอัปเดตที่สูญหายหรือหากคุณต้องการบังคับให้ลูกค้าทำ GET ทันทีหลังจากใส่แล้วอย่าส่งคืนอะไรจาก PUT
รหัสตอบกลับ HTTP 201 สำหรับ "สร้าง" พร้อมกับส่วนหัว "สถานที่ตั้ง" เพื่อชี้ไปที่ที่ลูกค้าสามารถค้นหาทรัพยากรที่สร้างขึ้นใหม่
ฉันใช้ RESTful API ในบริการของฉันและนี่คือความเห็นของฉัน: ก่อนอื่นเราต้องไปที่มุมมองทั่วไป:PUT
ใช้เพื่ออัปเดตทรัพยากรที่ไม่ได้สร้างหรือรับ
ฉันกำหนดทรัพยากรด้วย: Stateless resource
และStateful resource
:
ทรัพยากรไร้สัญชาติสำหรับทรัพยากรเหล่านี้เพียงแค่ส่งคืน HttpCode ด้วยเนื้อหาที่ว่างเปล่าก็เพียงพอแล้ว
ทรัพยากรที่เป็นของรัฐตัวอย่างเช่น: เวอร์ชันของทรัพยากร สำหรับทรัพยากรประเภทนี้คุณต้องระบุเวอร์ชันเมื่อคุณต้องการเปลี่ยนดังนั้นให้ส่งคืนทรัพยากรทั้งหมดหรือส่งคืนเวอร์ชันให้กับลูกค้าดังนั้นลูกค้าไม่จำเป็นต้องส่งคำขอรับหลังจากการดำเนินการอัพเดท
แต่สำหรับบริการหรือระบบให้มันsimple
,clearly
,easy to use and maintain
เป็นสิ่งที่สำคัญที่สุด
เช่นเดียวกับเนื้อความคำร้องขอที่ว่างเปล่านั้นยังคงรักษาวัตถุประสงค์เดิมของคำขอ GET และเนื้อหาการตอบสนองที่ว่างเปล่านั้นก็ยังคงวัตถุประสงค์เดิมของคำขอ PUT
ดูเหมือนจะโอเค ... แม้ว่าฉันจะคิดว่าตัวบ่งชี้พื้นฐานของความสำเร็จ / ล้มเหลว / เวลาโพสต์ / # ไบต์ที่ได้รับ / ฯลฯ น่าจะดีกว่า
แก้ไข: ฉันกำลังคิดตามบรรทัดของความถูกต้องของข้อมูลและ / หรือการเก็บบันทึก ข้อมูลเมตาเช่นแฮช MD5 หรือการประทับเวลาสำหรับเวลาที่ได้รับอาจมีประโยชน์สำหรับดาต้าไทล์ขนาดใหญ่
เป็นการดีที่มันจะกลับมาตอบสนองความสำเร็จ / ล้มเหลว
มีความแตกต่างระหว่างส่วนหัวและเนื้อหาของการตอบกลับ HTTP PUT ไม่ควรส่งคืนเนื้อความ แต่ต้องส่งคืนรหัสตอบกลับในส่วนหัว เพียงเลือก 200 ถ้าประสบความสำเร็จและ 4xx ถ้าไม่ใช่ ไม่มีสิ่งนั้นเป็นรหัสส่งคืน null ทำไมคุณถึงต้องการทำเช่นนี้?
200
PUT, DELETE หรือวิธีอื่นใดโดยเฉพาะ ฉันพลาดอะไรไปหรือเปล่า? เช่น Mozilla กลายเป็นหัวหน้าของ W3 และ IETF หรือไม่ ;) หรือบางทีพวกเขาไม่เคยได้ยินเกี่ยวกับหลักการความทนทานของ Postel