วิธีการออกแบบ REST API เพื่อจัดการกับการดำเนินการที่ไม่ใช่ CRUD?


11

ฉันพยายามแปลงชุดบริการที่ใช้ SOAP เป็น RESTful API

Subscriptionผมเริ่มด้วยการระบุทรัพยากรโดยการวิเคราะห์ชื่อการดำเนินงานและผมได้ทรัพยากร

เมื่อฉันต้องการอัปเดตสถานะการสมัครสมาชิกฉันไม่สามารถส่งPOSTคำขอไปยังเซิร์ฟเวอร์ได้เพราะฉันไม่สามารถเข้าถึงทรัพยากรได้โดยตรง แต่ฉันต้องเรียกการดำเนินงานสไตล์ RPC บางอย่างเพื่ออัปเดตคุณสมบัติของพวกเขา นอกจากนี้เฉพาะในกรณีที่ฉันเปลี่ยนสถานะของการสมัครเป็น "ใช้งานอยู่" ต้องทำการโทรเพิ่มเติมไปยังบริการภายนอก

ในกรณีเหล่านี้แนวทางปฏิบัติที่ดีที่สุดในการจัดการการปฏิบัติงานพื้นฐานคืออะไร

วิธีแก้ปัญหาที่ฉันพบคือการใช้พารามิเตอร์ข้อความค้นหาดังนั้นหากฉันต้องการเรียกใช้บริการการเปิดใช้งานฉันสามารถใช้สิ่งต่อไปนี้

POST /subscriptions/{subscriptionid}/?activate=true

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

อัปเดต 1:

ฉันสามารถใส่ค่า POST ลงในเนื้อหาได้เช่น "state": "active"

และตรวจสอบภายในบริการของฉันการดำเนินการที่เหมาะสมที่จะถูกเรียก


การแม็พคำสั่งของ REST ไปยังกริยา HTTP ล้มเหลวด้วยการดำเนินการที่ซับซ้อน คุณจะดีกว่าเพียงแค่การทำโทรสไตล์ RPC POST activateSubscription / {ID} ไม่มีใครจะสับสนโดยมัน
Ewan

@Ewan ฉันไม่แน่ใจว่าสิ่งนี้สอดคล้องกับรูปแบบ RESTful แต่ฉันมาพร้อมกับวิธีแก้ไขปัญหาอื่น: ในรหัสของฉันฉันสามารถเรียกการดำเนินการรูปแบบ RPC ที่เหมาะสมตามปริมาณข้อมูลที่ป้อน (ฉันสามารถผ่าน state = active ในเนื้อหาของ คำขอโพสต์ของฉันรหัสจะเรียกรหัสเปิดใช้งาน)
Vektor88

1
การปรับปรุงทรัพยากรที่มีอยู่เช่นนี้ควรเป็นแบบ PATCH และเนื้อหาของแบบสอบถามนั้นเป็นแบบจำลองบางส่วนของสิ่งที่คุณกำลังเปลี่ยนแปลง POST ควรจะเป็นคำขอที่สร้างทรัพยากร ความแตกต่างนี้นอกจากจะชัดเจนต่อผู้ใช้แล้วจะทำให้การรู้รหัสของคุณง่ายขึ้นเมื่อการดำเนินการนี้เกิดขึ้นแทนที่จะโพสต์ทรัพยากร
Mr Cochese

1
@ Vektor88 โดยทั่วไปแล้ว แต่เป็นการดำเนินการ idempotent ที่คุณต้องผ่านในการเป็นตัวแทนสถานะทรัพยากรทั้งหมด กรณีการใช้งานนี้ดูเหมือนจะเป็นการปรับปรุงบางส่วนซึ่งเหมาะกับ PATCH ดีจริงๆ
Mr Cochese

1
@MrCochese POST ไม่ใช่ idempotent
JimmyJames

คำตอบ:


8

คุณต้องดูการสนทนานี้โดย Jim Webber

เมื่อฉันต้องการอัปเดตสถานะการสมัครสมาชิกฉันไม่สามารถส่งคำขอ POST ไปยังเซิร์ฟเวอร์ได้เพราะฉันไม่สามารถเข้าถึงทรัพยากรได้โดยตรง แต่ฉันต้องเรียกการดำเนินงานสไตล์ RPC บางอย่างเพื่ออัปเดตคุณสมบัติของพวกเขา นอกจากนี้เฉพาะในกรณีที่ฉันเปลี่ยนสถานะของการสมัครเป็น "ใช้งานอยู่" จำเป็นต้องมีการโทรเพิ่มเติมไปยังบริการภายนอก

คิดว่า "การส่งข้อความ"; ส่งข้อความไปยังโดเมนของคุณโดยอธิบายสิ่งที่คุณต้องการให้เกิดขึ้น ผลข้างเคียงของข้อความคือโมเดลโดเมนของคุณเปลี่ยนสถานะจริง "ทรัพยากร" คือคิวข้อความ

POST /subscriptions/{subscriptionid}/?activate=true

การสะกดชื่อทรัพยากรไม่สำคัญกับเครื่อง แต่ผู้คนมักจะรู้สึกงุนงงเมื่อตัวระบุที่คุณใช้หยุดพักจากการประชุมว่าทรัพยากรเป็น "คำนาม"

นอกจากนี้เรากำลังพูดถึงทรัพยากรที่อยู่ใต้บังคับบัญชา/subscriptions/{subscriptionid}ดังนั้นการประชุม (ดูRFC 3986 ) เรียกร้องให้แสดงความสัมพันธ์นั้นกับส่วนของเส้นทางแทนที่จะใช้ส่วนของแบบสอบถาม

ดังนั้นการสะกดเหล่านี้อาจมีเหตุผล

POST /subscriptions/{subscriptionid}/messages
POST /subscriptions/{subscriptionid}/activations

1
การสนทนาของ Jim Webber มีอยู่ที่youtube.com/watch?v=aQVSzMV8DWc
674669

0

หากมีการตั้งค่าสถานะบูลีนเพื่อเปิดใช้งาน / ปิดใช้งานเนื้อหาฉันจะบอกว่าค่าเริ่มต้นคือการใช้ JSON:

POST /subscriptions/{subscriptionid}/
{
    format: 0,
    subscription: 
    {
        active: false
    }
}

สิ่งนี้จะขยายได้อย่างง่ายดายหากคุณต้องการสนับสนุนคุณสมบัติเพิ่มเติม อีกวิธีคือให้ปลายทางของมัน:

POST /subscriptions/{subscriptionid}/active/
DELETE /subscriptions/{subscriptionid}/active/

โดยส่วนตัวแล้วฉันจะใช้สิ่งนี้ก็ต่อเมื่อactiveสถานะของเหตุการณ์นี้ต้องการ / มีคุณสมบัติที่คุณสามารถส่ง / รับใน JSON เช่น ID ผู้ใช้หรือการตั้งค่า

หากไม่ใช่ค่าบูลีน แต่เป็นเพียงการกระทำที่คุณต้องทริกเกอร์ แต่ไม่ต้องการ / มีข้อเสนอแนะสถานะใด ๆ (ยกเว้นทันที 200 OK) ฉันจะใช้จุดปลายแบบนี้เพื่อเรียกมันเหมือน RPC:

POST /subscriptions/{subscriptionid}/activate/

เมื่อมีข้อสงสัยให้อ่านสิ่งนี้: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#restful (ดู "แล้วการกระทำที่ไม่เหมาะกับโลกของการปฏิบัติการ CRUD ล่ะ? ")


0

REST ใช้งานไม่ได้ Activateเป็นกริยาและไม่สามารถเป็นสถานะActiveเป็นรัฐได้

เนื่องจาก RESTful ใช้งานไม่ได้คุณไม่สามารถบอกบริการ RESTful ว่าต้องทำอะไร แต่คุณสามารถเพิ่มงานสำหรับคิวของบริการได้

ดูนี่:

PUT /subscriptionQueue
subscriptionId={subscriptionId}
active=true

คำขอนี้สงบและสนับสนุนผลประโยชน์ทั้งหมดของ RESTful (เช่นประสิทธิภาพกรด ... )

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