ฉันคิดว่าคุณสามารถใช้วิธี POST หรือ PATCH เพื่อจัดการสิ่งนี้ได้เนื่องจากโดยทั่วไปแล้วพวกเขาออกแบบมาสำหรับสิ่งนี้
โดยทั่วไปการใช้POST
เมธอดจะใช้เพื่อเพิ่มองค์ประกอบเมื่อใช้ในรายการทรัพยากร แต่คุณยังสามารถรองรับการดำเนินการต่างๆสำหรับวิธีนี้ได้ ดูคำตอบนี้: วิธีการอัพเดทคอลเลกชันทรัพยากร REST คุณยังสามารถรองรับรูปแบบการแทนค่าต่างๆสำหรับอินพุตได้ (หากสอดคล้องกับอาร์เรย์หรือองค์ประกอบเดียว)
ในกรณีนี้คุณไม่จำเป็นต้องกำหนดรูปแบบของคุณเพื่ออธิบายการอัปเดต
การใช้PATCH
เมธอดก็เหมาะสมเช่นกันเนื่องจากคำขอที่เกี่ยวข้องสอดคล้องกับการอัปเดตบางส่วน อ้างอิงจาก RFC5789 ( http://tools.ietf.org/html/rfc5789 ):
แอปพลิเคชันหลายตัวที่ขยาย Hypertext Transfer Protocol (HTTP) ต้องการคุณสมบัติในการแก้ไขทรัพยากรบางส่วน เมธอด HTTP PUT ที่มีอยู่อนุญาตให้เปลี่ยนเอกสารทั้งหมดเท่านั้น ข้อเสนอนี้เพิ่มวิธี HTTP ใหม่ PATCH เพื่อแก้ไขทรัพยากร HTTP ที่มีอยู่
ในกรณีนี้คุณต้องกำหนดรูปแบบของคุณเพื่ออธิบายการอัปเดตบางส่วน
ฉันคิดว่าในกรณีนี้POST
และPATCH
ค่อนข้างคล้ายกันเนื่องจากคุณไม่จำเป็นต้องอธิบายการดำเนินการสำหรับแต่ละองค์ประกอบ ฉันจะบอกว่ามันขึ้นอยู่กับรูปแบบของการเป็นตัวแทนที่จะส่ง
กรณีของPUT
มีความชัดเจนน้อยกว่าเล็กน้อย ในความเป็นจริงเมื่อใช้วิธีPUT
คุณควรระบุรายการทั้งหมด ตามความเป็นจริงการเป็นตัวแทนที่ให้ไว้ในคำขอจะแทนที่ทรัพยากรรายการหนึ่ง
คุณสามารถมีสองตัวเลือกเกี่ยวกับเส้นทางทรัพยากร
- ใช้เส้นทางทรัพยากรสำหรับรายการเอกสาร
ในกรณีนี้คุณต้องระบุลิงก์ของเอกสารอย่างชัดเจนพร้อมกับตัวประสานในการแสดงที่คุณระบุในคำขอ
/docs
นี่คือตัวอย่างสำหรับเส้นทางนี้
เนื้อหาของแนวทางดังกล่าวอาจมีไว้สำหรับวิธีการPOST
:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- ใช้เส้นทางทรัพยากรย่อยขององค์ประกอบสารยึดเกาะ
นอกจากนี้คุณยังสามารถพิจารณาใช้ประโยชน์จากเส้นทางย่อยเพื่ออธิบายความเชื่อมโยงระหว่างเอกสารและตัวประสาน คำแนะนำเกี่ยวกับการเชื่อมโยงระหว่าง doc และ binder ไม่จำเป็นต้องระบุในเนื้อหาคำขอ
/binder/{binderId}/docs
นี่คือตัวอย่างสำหรับเส้นทางนี้ ในกรณีนี้การส่งรายการเอกสารด้วยวิธีการPOST
หรือPATCH
จะแนบเอกสารไปยังเครื่องผูกพร้อมตัวระบุbinderId
หลังจากสร้างเอกสารแล้วหากไม่มีอยู่
เนื้อหาของแนวทางดังกล่าวอาจมีไว้สำหรับวิธีการPOST
:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
เกี่ยวกับการตอบกลับขึ้นอยู่กับคุณที่จะกำหนดระดับของการตอบกลับและข้อผิดพลาดที่จะส่งกลับ ฉันเห็นสองระดับ: ระดับสถานะ (ระดับโลก) และระดับน้ำหนักบรรทุก (ระดับทินเนอร์) นอกจากนี้ยังขึ้นอยู่กับคุณที่จะกำหนดว่าส่วนแทรก / การอัปเดตทั้งหมดที่เกี่ยวข้องกับคำขอของคุณต้องเป็นแบบอะตอมหรือไม่
ในกรณีนี้คุณสามารถใช้ประโยชน์จากสถานะ HTTP 200
หากทุกอย่างเป็นไปด้วยดีคุณจะได้รับสถานะ ไม่เช่นนั้นสถานะอื่นเช่น400
หากข้อมูลที่ให้มาไม่ถูกต้อง (เช่น binder id ไม่ถูกต้อง) หรืออย่างอื่น
ในกรณีนี้สถานะ200
จะถูกส่งกลับและขึ้นอยู่กับการแสดงการตอบสนองเพื่ออธิบายสิ่งที่ทำและข้อผิดพลาดเกิดขึ้น ElasticSearch มีจุดสิ้นสุดใน REST API สำหรับการอัปเดตจำนวนมาก ซึ่งอาจทำให้คุณมีความคิดบางอย่างในระดับนี้: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html
คุณยังสามารถใช้การประมวลผลแบบอะซิงโครนัสเพื่อจัดการกับข้อมูลที่ให้มา ในกรณีนี้ผลตอบแทนสถานะ HTTP 202
จะ ลูกค้าต้องดึงทรัพยากรเพิ่มเติมเพื่อดูว่าเกิดอะไรขึ้น
ก่อนที่จะจบผมยังต้องการที่จะแจ้งให้ทราบว่าสเปคที่อยู่ OData ปัญหาเกี่ยวกับความสัมพันธ์ระหว่างหน่วยงานที่มีคุณลักษณะชื่อลิงค์การนำทาง บางทีคุณสามารถดูสิ่งนี้ ;-)
ลิงค์ต่อไปนี้ยังสามารถช่วยให้คุณ: https://templth.wordpress.com/2014/12/15/designing-a-web-api/
หวังว่ามันจะช่วยคุณ Thierry
GET /docs
GET /docs?binder_id=x
หากต้องการลบส่วนย่อยของทรัพยากรฉันจะเรียกใช้DELETE /docs?binder_id=x
หรือฉันควรเรียกDELETE /docs
ใช้{"binder_id": x}
ในเนื้อหาคำขอ คุณเคยใช้PATCH /docs?binder_id=x
สำหรับการอัปเดตแบตช์หรือเพียงแค่PATCH /docs
และผ่านคู่?