เป็นที่เข้าใจได้ว่าจะสับสนเล็กน้อยเกี่ยวกับวิธีการใช้ REST อย่างถูกต้องตามวิธีที่ฉันได้เห็น บริษัท ขนาดใหญ่ออกแบบ REST API ของพวกเขา
คุณถูกต้องใน REST นั้นเป็นระบบการรวบรวมทรัพยากร มันหมายถึงการโอนรัฐตัวแทน ไม่ใช่คำจำกัดความที่ดีถ้าคุณถามฉัน แต่แนวคิดหลักคือ 4 HTTP VERBs และไร้สัญชาติ
สิ่งสำคัญที่ควรทราบคือคุณมี VERBS 4 ตัวที่มี REST เหล่านี้คือ GET, POST, PUT และ DELETE resend
ตัวอย่างของคุณจะเพิ่มคำกริยาใหม่ไปยัง REST นี่ควรเป็นธงสีแดง
คำถามที่ 1
สิ่งสำคัญคือต้องตระหนักว่าผู้เรียกใช้ REST API ของคุณไม่ควรต้องรู้ว่าการดำเนินการPUT
กับคอลเลกชันของคุณจะส่งผลให้อีเมลถูกสร้างขึ้น นั่นเป็นกลิ่นของการรั่วไหลของฉัน สิ่งที่พวกเขารู้คือการทำงานPUT
อาจส่งผลให้มีงานพิเศษซึ่งพวกเขาสามารถสอบถามได้ในภายหลัง พวกเขาจะรู้สิ่งนี้โดยการทำGET
บนทรัพยากรที่เพิ่งสร้างขึ้น นั่นGET
จะส่งคืนทรัพยากรและรหัสทรัพยากรทั้งหมดที่Task
เกี่ยวข้อง Task
จากนั้นคุณสามารถสอบถามภายหลังงานเหล่านั้นเพื่อตรวจสอบสถานะของพวกเขาและส่งใหม่
คุณมีตัวเลือกน้อย
REST - วิธีการทำงานตามทรัพยากร
สร้างtasks
ทรัพยากรที่คุณสามารถส่งงานเฉพาะลงในระบบของคุณเพื่อดำเนินการ จากนั้นคุณสามารถGET
ทำงานตามภารกิจที่ID
ส่งคืนเพื่อพิจารณาสถานะของงานนั้น
หรือคุณสามารถมิกซ์ในSOAP over HTTP
Web Service เพื่อเพิ่ม RPC บางอย่างเข้ากับสถาปัตยกรรมของคุณ
การสืบค้นสำหรับงานทั้งหมดสำหรับทรัพยากรเฉพาะ
GET http://server/api/myCollection/123/tasks
{ "tasks" :
[ { "22333" : "http://server/api/tasks/223333" } ]
}
ตัวอย่างทรัพยากรงาน
PUT http://server/api/tasks
{
"type" : "send-email" ,
"parameters" :
{
"collection-type" : "foo" ,
"collection-id" : "123"
}
}
==> ส่งคืน id ของภารกิจ
223334
GET http://server/api/tasks/223334
{
"status" : "complete" ,
"date" : "whenever"
}
ส่วนที่เหลือ - การใช้ POST เพื่อทริกเกอร์การกระทำ
คุณสามารถPOST
เพิ่มข้อมูลลงในทรัพยากรได้ตลอดเวลา ในความคิดของฉันนี้จะละเมิดวิญญาณของ REST แต่มันจะยังคงเป็นไปตาม
คุณสามารถทำ POST คล้ายกับสิ่งนี้:
POST http://server/api/collection/123
{ "action" : "send-email" }
คุณจะอัปเดตทรัพยากร 123 จากการรวบรวมด้วยข้อมูลเพิ่มเติม ข้อมูลเพิ่มเติมนั้นเป็นสิ่งที่บอกให้แบ็กเอนด์ส่งอีเมลสำหรับทรัพยากรนั้น
ปัญหาที่ฉันมีคือว่าGET
บนทรัพยากรจะส่งคืนข้อมูลที่อัปเดตนี้ อย่างไรก็ตามสิ่งนี้จะแก้ปัญหาความต้องการของคุณและยังคงสงบ
SOAP - บริการบนเว็บที่ยอมรับทรัพยากรที่ได้รับจาก REST
สร้าง WebService ใหม่ซึ่งคุณสามารถส่งอีเมลตาม ID ทรัพยากรก่อนหน้านี้จาก REST API ฉันจะไม่ไปลงรายละเอียดเกี่ยวกับสบู่ที่นี่เป็นคำถามเดิมเป็นเรื่องเกี่ยวกับการพักผ่อนและทั้งสองแนวคิด / เทคโนโลยีไม่ควรนำมาเปรียบเทียบเป็นมันของแอปเปิ้ลและส้ม
คำถามที่ 2
คุณมีตัวเลือกไม่กี่ตัวที่นี่:
ดูเหมือนว่า บริษัท ขนาดใหญ่จำนวนมากที่เผยแพร่ REST API จะเปิดเผยsearch
คอลเลกชันที่เป็นเพียงวิธีการส่งผ่านพารามิเตอร์การสืบค้นเพื่อส่งคืนทรัพยากร
GET http://server/api/search?q="type = myCollection & someField >= someval"
ซึ่งจะส่งคืนชุดทรัพยากร REST ที่มีคุณสมบัติครบถ้วนเช่น:
{
"results" :
{ [
"location" : "http://server/api/myCollection/1",
"location" : "http://server/api/myCollection/9",
"location" : "http://server/api/myCollection/56"
]
}
}
หรือคุณสามารถอนุญาตบางอย่างเช่นMVELเป็นพารามิเตอร์การสืบค้น
คำถามที่ 3
ฉันชอบระดับย่อยมากกว่าต้องย้อนกลับไปค้นหาทรัพยากรอื่นด้วยพารามิเตอร์การสืบค้น ฉันไม่เชื่อว่ามีกฎใด ๆ ไม่ทางใดก็ทางหนึ่ง คุณสามารถใช้ทั้งสองวิธีและอนุญาตให้ผู้โทรตัดสินใจว่าจะเลือกสิ่งใดที่เหมาะสมกว่าโดยพิจารณาจากวิธีที่พวกเขาเข้าสู่ระบบเป็นครั้งแรก
หมายเหตุ
ฉันไม่เห็นด้วยเกี่ยวกับความเห็นที่อ่านได้จากผู้อื่น แม้ว่าสิ่งที่บางคนอาจคิดว่า REST นั้นยังไม่ได้มีไว้สำหรับมนุษย์ มันมีไว้สำหรับการบริโภคเครื่อง หากฉันต้องการดูทวีตของฉันฉันใช้เว็บไซต์ปกติของ Twitters ฉันไม่ได้ใช้ REST GET กับ API ของพวกเขา ถ้าฉันต้องการทำบางสิ่งบางอย่างกับทวีตโดยทางโปรแกรมฉันก็ใช้ REST API ใช่ API ควรเป็นที่เข้าใจได้ แต่สิ่งที่คุณทำgte
ไม่ดี
อีกสิ่งที่สำคัญกับ REST ก็คือคุณควรเริ่มต้นที่จุดใดก็ได้ใน API ของคุณและไปยังแหล่งข้อมูลอื่น ๆ ที่เกี่ยวข้องโดยไม่ทราบ URL ที่แน่นอนของทรัพยากรอื่น ๆ ล่วงหน้า ผลลัพธ์ของGET
VERB ใน REST ควรส่งคืน REST URL แบบเต็มของทรัพยากรที่อ้างอิง ดังนั้นแทนที่จะแบบสอบถามกลับหมายเลขหนึ่งของPerson
วัตถุก็จะกลับ URL http://server/api/people/13
แบบเต็มที่เช่น จากนั้นคุณสามารถนำทางผลลัพธ์โดยทางโปรแกรมได้แม้ว่าจะเปลี่ยน URL ก็ตาม
การตอบสนองต่อความคิดเห็น
ในโลกแห่งความเป็นจริงมีสิ่งต่าง ๆ ที่จำเป็นต้องเกิดขึ้นซึ่งไม่ได้สร้างอ่านปรับปรุงหรือลบทรัพยากร (CRUD)
สามารถดำเนินการเพิ่มเติมในทรัพยากร ฐานข้อมูลเชิงสัมพันธ์ทั่วไปสนับสนุนแนวคิดของ Stored Procedure เหล่านี้เป็นคำสั่งเพิ่มเติมที่สามารถดำเนินการกับชุดข้อมูล REST ไม่มีแนวคิดโดยเนื้อแท้ และไม่มีเหตุผลที่ควรจะเป็น การกระทำประเภทนี้เหมาะสำหรับ RPC หรือ SOAP Web Services
นี่เป็นปัญหาทั่วไปที่ฉันเห็นด้วย REST API นักพัฒนาซอฟต์แวร์ไม่ชอบข้อ จำกัด ทางแนวคิดที่ล้อมรอบ REST ดังนั้นพวกเขาจึงปรับมันเพื่อทำสิ่งที่พวกเขาต้องการ ที่ทำลายมันจากการเป็นบริการสงบแม้ว่า โดยพื้นฐานแล้ว URL เหล่านั้นจะถูกGET
เรียกใช้บนเซิร์ฟเล็ตที่เลียนแบบ REST
คุณมีตัวเลือกน้อย:
- สร้างทรัพยากรงาน
- สนับสนุน
POST
ข้อมูลเพิ่มเติมไปยังทรัพยากรเพื่อดำเนินการ
- เพิ่มคำสั่งเพิ่มเติมผ่าน SOAP Web Service
หากคุณใช้พารามิเตอร์การสืบค้นที่ HTTP VERB คุณจะใช้เพื่อส่งอีเมลอีกครั้งหรือไม่
GET
- สิ่งนี้ส่งอีเมลอีกครั้งและส่งคืนข้อมูลของทรัพยากรหรือไม่ จะเกิดอะไรขึ้นหากระบบแคช URL นั้นและถือว่าเหมือนกับ URL เฉพาะสำหรับทรัพยากรนั้น ทุกครั้งที่พวกเขากด URL มันจะส่งอีเมลอีกครั้ง
POST
- คุณไม่ได้ส่งข้อมูลใหม่ใด ๆ ไปยังทรัพยากรจริง ๆ แล้วเป็นเพียงพารามิเตอร์การสืบค้นเพิ่มเติม
ขึ้นอยู่กับข้อกำหนดที่ได้รับทั้งหมดการทำPOST
ทรัพยากรที่มีaction field
ข้อมูล POST จะช่วยแก้ปัญหาได้