เห็นได้ชัดว่าส่วนที่เหลือเป็นเพียงชุดของการประชุมเกี่ยวกับวิธีการใช้มี HTTP ฉันสงสัยว่าข้อได้เปรียบของการประชุมเหล่านี้ให้ประโยชน์อะไรบ้าง มีใครรู้บ้าง
เห็นได้ชัดว่าส่วนที่เหลือเป็นเพียงชุดของการประชุมเกี่ยวกับวิธีการใช้มี HTTP ฉันสงสัยว่าข้อได้เปรียบของการประชุมเหล่านี้ให้ประโยชน์อะไรบ้าง มีใครรู้บ้าง
คำตอบ:
ผมไม่คิดว่าคุณจะได้คำตอบที่ดีในการนี้ส่วนหนึ่งเป็นเพราะไม่มีใครเห็นด้วยกับสิ่งที่ส่วนที่เหลือคือ หน้าวิกิพีเดียเป็นหนักใน buzzwords และแสงในคำอธิบาย หน้าการสนทนานั้นมีค่าเพียงการอ่านเพื่อดูว่าผู้คนไม่เห็นด้วยกับเรื่องนี้มากแค่ไหน เท่าที่ฉันสามารถบอกได้ REST หมายถึงสิ่งนี้:
แทนที่จะมีชื่อสุ่มหมาและทะเยอทะยาน URL และที่ใช้GET
สำหรับ getters ทั้งหมดและPOST
สำหรับทุก setters เราพยายามที่จะมี URL ที่ระบุทรัพยากรและจากนั้นใช้การกระทำของ HTTP GET
, POST
, PUT
และDELETE
ที่จะทำสิ่งที่จะให้พวกเขา ดังนั้นแทนที่จะ
GET /get_article?id=1
POST /delete_article id=1
คุณจะทำ
GET /articles/1/
DELETE /articles/1/
และจากนั้นPOST
และPUT
สอดคล้องกับการดำเนินการ "สร้าง" และ "อัปเดต" (แต่ไม่มีใครเห็นด้วยกับวิธีใดก็ตาม)
ผมคิดว่าข้อโต้แย้งแคชมีความผิดเพราะสตริงแบบสอบถามจะถูกเก็บไว้ชั่วคราวโดยทั่วไปและนอกจากนี้คุณไม่จำเป็นจริงๆที่จะใช้พวกเขา ตัวอย่างเช่น django ทำให้บางสิ่งเช่นนี้ง่ายมากและฉันจะไม่พูดว่า REST:
GET /get_article/1/
POST /delete_article/ id=1
หรือแม้แต่รวมกริยาใน URL:
GET /read/article/1/
POST /delete/article/1/
POST /update/article/1/
POST /create/article/
ในกรณีนั้นGET
หมายถึงบางสิ่งที่ไม่มีผลข้างเคียงและPOST
หมายถึงสิ่งที่เปลี่ยนแปลงข้อมูลบนเซิร์ฟเวอร์ ผมคิดว่านี่อาจจะเป็นบิตที่ชัดเจนและง่ายขึ้นโดยเฉพาะอย่างยิ่งคุณสามารถหลีกเลี่ยงทั้งPUT
-vs- POST
สิ่ง นอกจากนี้คุณยังสามารถเพิ่มคำกริยาเพิ่มเติมได้หากต้องการดังนั้นคุณจึงไม่ผูกพันกับข้อเสนอ HTTP ที่ปลอมแปลง ตัวอย่างเช่น:
POST /hide/article/1/
POST /show/article/1/
(หรืออะไรก็ตามมันเป็นการยากที่จะคิดตัวอย่างจนกว่าจะเกิดขึ้น!)
ดังนั้นโดยสรุปมีเพียงสองข้อได้เปรียบที่ฉันเห็น:
synchronize("/articles/1/")
หรืออะไรก็ได้ ขึ้นอยู่กับรหัสของคุณเป็นอย่างมากอย่างไรก็ตามฉันคิดว่ามีข้อเสียที่ค่อนข้างใหญ่:
PUT
และPOST
เป็นอย่างไร ในภาษาอังกฤษพวกเขาหมายถึงสิ่งที่คล้ายกัน ("ฉันจะวาง / โพสต์ประกาศบนผนัง")ดังนั้นโดยสรุปฉันจะพูดว่า: หากคุณไม่ต้องการใช้ความพยายามเพิ่มเติมหรือถ้าบริการของคุณแมปกับการทำงานของ CRUD ได้ดีให้บันทึก REST สำหรับ API รุ่นที่สองของคุณ
ฉันเพิ่งเจอปัญหาอื่นของ REST: ไม่ใช่เรื่องง่ายที่จะทำมากกว่าหนึ่งอย่างในคำขอเดียวหรือระบุส่วนของวัตถุประกอบที่คุณต้องการได้รับ สิ่งนี้มีความสำคัญอย่างยิ่งบนอุปกรณ์พกพาซึ่งมีความสำคัญต่อการเดินทางไปกลับและการเชื่อมต่อไม่น่าเชื่อถือ ตัวอย่างเช่นสมมติว่าคุณได้รับโพสต์บนไทม์ไลน์ของ Facebook วิธี REST "บริสุทธิ์" จะเป็นอย่างไร
GET /timeline_posts // Returns a list of post IDs.
GET /timeline_posts/1/ // Returns a list of message IDs in the post.
GET /timeline_posts/2/
GET /timeline_posts/3/
GET /message/10/
GET /message/11/
....
ซึ่งเป็นเรื่องที่ไร้สาระ API ของ Facebook นั้นยอดเยี่ยมมาก IMO ดังนั้นมาดูกันว่าพวกเขาทำอะไร:
โดยค่าเริ่มต้นคุณสมบัติของวัตถุส่วนใหญ่จะถูกส่งกลับเมื่อคุณทำแบบสอบถาม คุณสามารถเลือกเขตข้อมูล (หรือการเชื่อมต่อ) ที่คุณต้องการส่งคืนด้วยพารามิเตอร์การสืบค้น "เขตข้อมูล" ตัวอย่างเช่น URL นี้จะส่งคืนรหัสชื่อและรูปภาพของเบ็นเท่านั้น: https://graph.facebook.com/bgolub?fields=id,name,picture
ฉันไม่รู้ว่าคุณจะทำอะไรแบบนั้นกับ REST และถ้าคุณทำไม่ว่ามันจะยังคงนับเป็น REST แน่นอนฉันจะไม่สนใจใครก็ตามที่พยายามจะบอกคุณว่าคุณไม่ควรทำเช่นนั้น (โดยเฉพาะอย่างยิ่งถ้าเหตุผลคือ "เพราะไม่ใช่ส่วนที่เหลือ")!
/user/{id}
แล้วมันไม่ได้พักผ่อนพิจารณา: เบราว์เซอร์ของคุณจะต้องมาโปรแกรมล่วงหน้ารู้วิธี HTML หน้า?
พูดง่ายๆคือ REST หมายถึงการใช้ HTTP อย่างที่ควรจะเป็น
มีลักษณะที่วิทยานิพนธ์รอยฟีลดิงเกี่ยวกับส่วนที่เหลือ ฉันคิดว่าทุกคนที่ทำการพัฒนาเว็บไซต์ควรอ่าน
Roy Fielding เป็นหนึ่งในตัวขับเคลื่อนหลักที่อยู่เบื้องหลังโปรโตคอล HTTP เช่นกัน
ในการตั้งชื่อคำแนะนำบางส่วน:
ใส่เพียง: NONE
รู้สึกอิสระที่จะ downvote แต่ฉันยังคงคิดว่าไม่มีผลประโยชน์ที่แท้จริงมากกว่า non-REST HTTP คำตอบปัจจุบันทั้งหมดไม่ถูกต้อง ข้อโต้แย้งจากคำตอบที่โหวตมากที่สุดในปัจจุบัน:
ด้วย REST คุณต้องการเลเยอร์การสื่อสารเพิ่มเติมสำหรับฝั่งเซิร์ฟเวอร์และสคริปต์ฝั่งไคลเอ็นต์ => จริงๆแล้วมันซับซ้อนกว่าการใช้ HTTP ที่ไม่ใช่ REST
การแคชสามารถควบคุมได้โดยส่วนหัว HTTP ที่ส่งโดยเซิร์ฟเวอร์ REST จะไม่เพิ่มคุณสมบัติใด ๆ ที่ขาดหายไปในที่ไม่ใช่ REST
REST ไม่ได้ช่วยให้คุณจัดระเบียบสิ่งต่าง ๆ มันบังคับให้คุณใช้ API ที่สนับสนุนโดยไลบรารีฝั่งเซิร์ฟเวอร์ที่คุณใช้ คุณสามารถจัดระเบียบแอปพลิเคชันของคุณในลักษณะเดียวกัน (หรือดีกว่า) เมื่อคุณใช้วิธีการที่ไม่ใช่แบบ REST เช่นดูModel-View-ControllerหรือMVC เส้นทาง
ไม่จริงเลย ทุกอย่างขึ้นอยู่กับว่าคุณจัดระเบียบและจัดทำเอกสารใบสมัครของคุณอย่างไร REST จะไม่ทำให้แอปพลิเคชันของคุณดีขึ้นอย่างน่าอัศจรรย์
IMHO ข้อได้เปรียบที่ใหญ่ที่สุดที่ REST เปิดใช้คือลดการเชื่อมต่อไคลเอ็นต์ / เซิร์ฟเวอร์ มันง่ายกว่ามากในการพัฒนาส่วนต่อประสาน REST เมื่อเวลาผ่านไปโดยไม่ทำลายลูกค้าที่มีอยู่
แต่ละทรัพยากรมีการอ้างอิงไปยังแหล่งข้อมูลอื่น ๆ ไม่ว่าจะเป็นในลำดับชั้นหรือลิงก์ดังนั้นจึงสะดวกในการเรียกดู นี่คือข้อได้เปรียบที่มนุษย์พัฒนาลูกค้าประหยัดเขา / เธอจากการให้คำปรึกษาเอกสารและเสนอคำแนะนำอย่างต่อเนื่อง นอกจากนี้ยังหมายความว่าเซิร์ฟเวอร์สามารถเปลี่ยนชื่อทรัพยากรได้เพียงฝ่ายเดียว (ตราบใดที่ซอฟต์แวร์ไคลเอนต์ไม่ได้เข้ารหัส URL)
คุณสามารถม้วนเข้าไปในส่วนใดส่วนหนึ่งของ API หรือใช้เว็บเบราว์เซอร์เพื่อนำทางแหล่งข้อมูล ทำให้การดีบักและการรวมการทดสอบง่ายขึ้นมาก
ช่วยให้คุณระบุการกระทำโดยไม่ต้องค้นหาคำที่ถูกต้อง ลองคิดดูหาก getters OOP และ setters ไม่ได้มาตรฐานและบางคนใช้retrieve
และdefine
แทน คุณจะต้องจดจำคำกริยาที่ถูกต้องสำหรับจุดเชื่อมต่อแต่ละจุด รู้ว่ามีเพียงไม่กี่คำกริยามีเคาน์เตอร์ที่มีปัญหานั้น
หากคุณGET
เป็นทรัพยากรที่ไม่มีอยู่คุณสามารถมั่นใจได้ว่าจะได้รับ404
ข้อผิดพลาดใน RESTful API ตัดกันกับ API ที่ไม่สงบซึ่งอาจ{error: "Not found"}
ห่อหุ้มในพระเจ้ากลับมารู้ว่าเลเยอร์กี่ชั้น หากคุณต้องการพื้นที่พิเศษในการเขียนข้อความถึงนักพัฒนาในอีกด้านหนึ่งคุณสามารถใช้เนื้อหาของการตอบกลับได้ตลอดเวลา
ลองนึกภาพ API สองตัวที่มีฟังก์ชั่นเดียวกันอันที่หนึ่งกำลังติดตาม REST และอีกอันไม่ใช่ ตอนนี้ลองนึกภาพไคลเอนต์ต่อไปนี้สำหรับ API เหล่านั้น:
สงบ:
GET /products/1052/reviews
POST /products/1052/reviews "5 stars"
DELETE /products/1052/reviews/10
GET /products/1052/reviews/10
http:
GET /reviews?product_id=1052
POST /post_review?product_id=1052 "5 stars"
POST /remove_review?product_id=1052&review_id=10
GET /reviews?product_id=1052&review=10
ลองคิดถึงคำถามต่อไปนี้:
หากการโทรครั้งแรกของลูกค้าแต่ละรายทำงานได้คุณมั่นใจได้ว่าจะได้รับส่วนที่เหลือด้วย
มีการอัปเดตที่สำคัญสำหรับ API ที่อาจหรืออาจไม่มีการเปลี่ยนแปลงจุดเชื่อมต่อเหล่านั้น คุณต้องอ่านเอกสารมากแค่ไหน
คุณสามารถทำนายการส่งคืนของแบบสอบถามล่าสุดได้หรือไม่
คุณต้องแก้ไขความเห็นที่โพสต์ (ก่อนที่จะลบ) คุณสามารถทำได้โดยไม่ตรวจสอบเอกสารหรือไม่
ฉันแนะนำให้ดูที่ Ryan Tomayko ของวิธีที่ฉันอธิบาย REST กับภรรยาของฉัน
ข้อความที่ตัดตอนมาจากลิงค์ waybackmaschine:
ตัวอย่างเป็นอย่างไร คุณเป็นครูและต้องการจัดการนักเรียน:
หากระบบที่มีบนเว็บแล้วอาจมี URL student, teacher, class, book, room, etc
สำหรับแต่ละคำนามที่เกี่ยวข้องที่นี่: ... หากมีการแสดงเครื่องที่สามารถอ่านได้สำหรับแต่ละ URL มันจะไม่สำคัญที่จะสลักเครื่องมือใหม่เข้าสู่ระบบเพราะข้อมูลทั้งหมดนั้นจะสิ้นเปลืองในแบบมาตรฐาน ... คุณสามารถสร้างระบบทั่วประเทศที่สามารถพูดคุยกับแต่ละระบบโรงเรียนเพื่อรวบรวมคะแนนการทดสอบ
แต่ละระบบจะรับข้อมูลจากกันและกันโดยใช้ HTTP GET อย่างง่าย หากระบบหนึ่งต้องการเพิ่มบางสิ่งในระบบอื่นระบบจะใช้ HTTP POST หากระบบต้องการอัปเดตบางอย่างในระบบอื่นระบบจะใช้ HTTP PUT สิ่งเดียวที่เหลือก็คือว่าข้อมูลควรมีลักษณะอย่างไร
ฉันอยากจะแนะนำให้ทุกคนที่กำลังมองหาคำตอบสำหรับคำถามนี้ผ่าน"สไลด์โชว์"นี้
ฉันไม่เข้าใจว่า REST คืออะไรและทำไมมันถึงเย็นมากข้อดีและข้อเสียของมันแตกต่างจาก SOAP - แต่สไลด์โชว์นี้ยอดเยี่ยมและเข้าใจง่ายดังนั้นตอนนี้ฉันจึงชัดเจนกว่าเดิมมาก
เก็บเอาไว้.
มีประโยชน์เชิงลึกอื่น ๆ เพิ่มเติมของ REST ซึ่งหมุนรอบความสามารถในการวิวัฒนาการผ่านการแต่งงานกันแบบหลวม ๆ และไฮเปอร์เท็กซ์ แต่กลไกการแคชเป็นเหตุผลหลักที่คุณควรสนใจ RESTful HTTP
GET /get_article/19/
และPOST /update_article
ถ้าแคชเป็นข้อกังวลของคุณ คุณยังสามารถทำทุกอย่างที่มีเพียงGET
และPOST
และผมเชื่อว่าREST
หมายถึง "การใช้งานGET
, POST
, PUT
และDELETE
เพียง." และไม่ใช่แค่ "อย่าใช้สตริงการสืบค้น" REST
ดังนั้นสิ่งที่ผมแนะนำจะไม่เป็น จากนั้นอีกครั้งไม่มีใครสามารถยอมรับสิ่งที่REST
เป็นจริงดังนั้นฉันวางไว้ในถังด้วย "Web 2.0"
มันเขียนลงในวิทยานิพนธ์ฟีลดิง แต่ถ้าคุณไม่ต้องการอ่านมาก:
เป็นไปได้ไหมที่จะทำทุกอย่างด้วย POST และ GET? ใช่มันเป็นแนวทางที่ดีที่สุดหรือไม่? ไม่ทำไม? เพราะเรามีวิธีการมาตรฐาน หากคุณคิดอีกครั้งมันเป็นไปได้ที่จะทำทุกอย่างโดยใช้เพียงแค่รับ .. ดังนั้นทำไมเราถึงต้องใช้ POST ด้วยซ้ำ เพราะมาตรฐาน!
ตัวอย่างเช่นวันนี้กำลังคิดถึงโมเดล MVC คุณสามารถ จำกัด แอปพลิเคชันของคุณเพื่อตอบสนองต่อคำกริยาเฉพาะชนิดเช่น POST, GET, PUT และ DELETE แม้ว่าทุกสิ่งทุกอย่างจะถูกโพสต์และรับภายใต้ประทุนไม่เหมาะสมที่จะมีคำกริยาที่แตกต่างกันสำหรับการกระทำที่แตกต่างกันใช่ไหม
การค้นพบนั้นง่ายกว่าใน REST เรามีเอกสาร WADL (คล้ายกับ WSDL ใน webservices แบบดั้งเดิม) ที่จะช่วยให้คุณโฆษณาบริการของคุณไปทั่วโลก คุณสามารถใช้การค้นพบ UDDI ได้เช่นกัน ด้วย HTTP POST และ GET แบบดั้งเดิมผู้คนอาจไม่ทราบคำขอข้อความและสกีมาตอบกลับของคุณเพื่อโทรหาคุณ
ข้อดีอย่างหนึ่งคือเราสามารถประมวลผลเอกสาร XML แบบไม่ต่อเนื่องและข้อมูล unmarshal XML จากแหล่งต่าง ๆ เช่นวัตถุ InputStream, URL, โหนด DOM ...
@ Timmmm เกี่ยวกับการแก้ไขของคุณ:
GET /timeline_posts // could return the N first posts, with links to fetch the next/previous N posts
สิ่งนี้จะลดจำนวนการโทรลงอย่างมาก
และไม่มีอะไรป้องกันคุณจากการออกแบบเซิร์ฟเวอร์ที่ยอมรับพารามิเตอร์ HTTP เพื่อแสดงค่าฟิลด์ที่ลูกค้าของคุณอาจต้องการ ...
แต่นี่เป็นรายละเอียด
ที่สำคัญกว่านั้นคือความจริงที่ว่าคุณไม่ได้กล่าวถึงข้อดีมากมายของรูปแบบสถาปัตยกรรม REST (ความสามารถในการปรับขยายที่ดีขึ้นมากเนื่องจากการไร้สถานะของเซิร์ฟเวอร์ความพร้อมใช้งานที่ดีขึ้นมากเนื่องจากการไร้สถานะของเซิร์ฟเวอร์ด้วย อินสแตนซ์เมื่อใช้รูปแบบสถาปัตยกรรม REST การมีเพศสัมพันธ์ที่ต่ำกว่าระหว่างไคลเอนต์และเซิร์ฟเวอร์เนื่องจากการใช้อินเตอร์เฟสแบบอินเทอร์เฟซเหมือนกัน ฯลฯ เป็นต้น)
สำหรับคำพูดของคุณ
"ไม่ใช่ทุกการกระทำที่แมปไปยัง CRUD อย่างง่ายดาย (สร้างอ่าน / ดึงข้อมูลอัปเดตลบ)"
: RDBMS ใช้วิธี CRUD เช่นกัน (SELECT / INSERT / DELETE / UPDATE) และมีวิธีการแสดงและดำเนินการตามตัวแบบข้อมูลเสมอ
เกี่ยวกับประโยคของคุณ
"คุณอาจไม่ได้จัดการกับทรัพยากรประเภทวัตถุ"
: การออกแบบ RESTful นั้นโดยพื้นฐานแล้วการออกแบบที่เรียบง่าย - แต่นี่ไม่ได้หมายความว่าการออกแบบนั้นเรียบง่าย คุณเห็นความแตกต่างหรือไม่ คุณจะต้องคิดมากเกี่ยวกับแนวคิดที่แอปพลิเคชันของคุณจะเป็นตัวแทนและจัดการหากคุณต้องการสิ่งที่ต้องทำเพื่อที่จะนำเสนอสิ่งนี้โดยใช้ทรัพยากร แต่ถ้าคุณทำเช่นนั้นคุณจะจบลงด้วยการออกแบบที่เรียบง่ายและมีประสิทธิภาพมากขึ้น
เครื่องมือค้นหาสามารถละเว้นข้อความค้นหาได้