อะไรคือข้อดีของการใช้ REST แทน non-REST HTTP?


161

เห็นได้ชัดว่าส่วนที่เหลือเป็นเพียงชุดของการประชุมเกี่ยวกับวิธีการใช้มี HTTP ฉันสงสัยว่าข้อได้เปรียบของการประชุมเหล่านี้ให้ประโยชน์อะไรบ้าง มีใครรู้บ้าง


คำตอบ:


162

ผมไม่คิดว่าคุณจะได้คำตอบที่ดีในการนี้ส่วนหนึ่งเป็นเพราะไม่มีใครเห็นด้วยกับสิ่งที่ส่วนที่เหลือคือ หน้าวิกิพีเดียเป็นหนักใน 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/

(หรืออะไรก็ตามมันเป็นการยากที่จะคิดตัวอย่างจนกว่าจะเกิดขึ้น!)

ดังนั้นโดยสรุปมีเพียงสองข้อได้เปรียบที่ฉันเห็น:

  1. API เว็บของคุณอาจสะอาดและง่ายต่อการเข้าใจ / ค้นหา
  2. เมื่อซิงโครไนซ์ข้อมูลกับเว็บไซต์อาจเป็นเรื่องง่ายกว่าที่จะใช้ REST เพราะคุณสามารถพูดsynchronize("/articles/1/")หรืออะไรก็ได้ ขึ้นอยู่กับรหัสของคุณเป็นอย่างมาก

อย่างไรก็ตามฉันคิดว่ามีข้อเสียที่ค่อนข้างใหญ่:

  1. ไม่ใช่ทุกการกระทำที่แมปไปยัง CRUD อย่างง่ายดาย (สร้างอ่าน / เรียกคืนอัปเดตลบ) คุณอาจไม่ได้จัดการกับทรัพยากรประเภทวัตถุ
  2. มันเป็นความพยายามพิเศษเพื่อผลประโยชน์ที่น่าสงสัย
  3. ความสับสนว่าเป็นรอบทางไหน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 แน่นอนฉันจะไม่สนใจใครก็ตามที่พยายามจะบอกคุณว่าคุณไม่ควรทำเช่นนั้น (โดยเฉพาะอย่างยิ่งถ้าเหตุผลคือ "เพราะไม่ใช่ส่วนที่เหลือ")!


4
POST และ PUT นั้นใช้สำหรับ HTTP RFC ในกรณีนี้ PUT หมายถึงการสร้าง / อัปเดตบางสิ่งบางอย่างในสถานที่เฉพาะซึ่งเกิดขึ้นอยู่กับว่ามีบางสิ่งอยู่ใน URI (และเป็น idempotent ด้วย) ในขณะที่ POST หมายถึงคุณขอให้บริการเว็บระบุว่าคุณต้องการวางอะไร ส่งมัน - และจากนั้นจะส่งคืน URI ให้คุณ (เพื่อสร้างเท่านั้น) ไม่สามารถบ่นเกี่ยวกับภาษาอังกฤษได้จริง ๆ ไม่ใช่เมื่อปิดการใช้ DELETE อย่างสมบูรณ์เมื่ออ้างถึงสิ่งที่ปิดคอมพิวเตอร์ ฉันสงสัยเกี่ยวกับสิ่งที่เกี่ยวข้องกับปัญหาที่เกิดขึ้นในการแก้ไขของคุณ แต่: P
น่าน L

7
ตัวอย่าง Facebook API ดูเหมือนว่า REST สำหรับฉัน (จริง ๆ แล้วยิ่งกว่านั้นเพื่อให้ตัวอย่างของคุณใช้คำกริยาใน URL) ไม่มีเหตุผลใดที่พารามิเตอร์เคียวรีไม่สามารถสงบได้ แต่เป็นแนวปฏิบัติที่ดีในการใช้พา ธ ที่สามารถจัดเรียงข้อมูลในลำดับชั้นได้
Justin Emery

5
สตริงข้อความค้นหาสงบเงียบอย่างสมบูรณ์แบบตราบใดที่คุณไม่ได้อ้างถึงแหล่งข้อมูลในนั้น ฉันมักจะคิดถึงพวกเขามากกว่าตัวกรองที่สามารถปรับพฤติกรรมของจุดสิ้นสุด
Sinaesthetic

3
-1, REST เป็นสิ่งที่เฉพาะเจาะจงมาก - ตามที่ Roy Fielding อธิบายเมื่อเขาคิดค้นมัน ดูคำตอบนี้ โดยเฉพาะอย่างยิ่ง: "ลูกค้าต้องการทราบ URI เริ่มต้นเท่านั้นและจากนั้นเลือกจากตัวเลือกที่เซิร์ฟเวอร์จัดหาเพื่อนำทางหรือดำเนินการต่างๆ . โดยทั่วไปหากส่วนใดส่วนหนึ่งของจุดสิ้นสุดเอกสาร API เช่นพูดว่า "ให้รหัสผู้ใช้คุณสามารถรับข้อมูลผู้ใช้ที่/user/{id}แล้วมันไม่ได้พักผ่อนพิจารณา: เบราว์เซอร์ของคุณจะต้องมาโปรแกรมล่วงหน้ารู้วิธี HTML หน้า?
Claudiu

1
(ต่อ ... ) ที่คนอื่นใช้ผิดคำไม่เปลี่ยนว่ามันคืออะไร ข้อจำกัดความรับผิดชอบ: ฉันยังเพิ่งเรียนรู้ว่า REST คืออะไรและนี่คือสิ่งที่ฉันคลิกเมื่อเร็ว ๆ นี้
Claudiu

47

พูดง่ายๆคือ REST หมายถึงการใช้ HTTP อย่างที่ควรจะเป็น

มีลักษณะที่วิทยานิพนธ์รอยฟีลดิงเกี่ยวกับส่วนที่เหลือ ฉันคิดว่าทุกคนที่ทำการพัฒนาเว็บไซต์ควรอ่าน

Roy Fielding เป็นหนึ่งในตัวขับเคลื่อนหลักที่อยู่เบื้องหลังโปรโตคอล HTTP เช่นกัน

ในการตั้งชื่อคำแนะนำบางส่วน:

  • ง่าย
  • คุณสามารถใช้แคช HTTP และพร็อกซีเซิร์ฟเวอร์ได้เป็นอย่างดีเพื่อช่วยคุณจัดการภาระงานสูง
  • มันช่วยให้คุณสามารถจัดระเบียบแอพพลิเคชั่นที่ซับซ้อนมากให้เป็นแหล่งข้อมูลง่ายๆ
  • ช่วยให้ลูกค้าใหม่ใช้แอปพลิเคชันของคุณได้ง่ายแม้ว่าคุณจะไม่ได้ออกแบบมาเฉพาะสำหรับพวกเขา (อาจเป็นเพราะพวกเขาไม่ได้อยู่ใกล้ ๆ เมื่อคุณสร้างแอป)

11
"Simple": ทำไม REST จึงง่ายกว่า HTTP?
Dimitri C.

5
"ช่วยให้คุณจัดระเบียบ": ดังนั้นองค์กรนี้จึงยากขึ้นเมื่อใช้ GET และ POST เท่านั้น
Dimitri C.

1
"มันทำให้ง่ายสำหรับลูกค้าใหม่ที่จะใช้แอปพลิเคชันของคุณ": มันเกี่ยวกับ REST กับ HTTP ธรรมดาใช่ไหม?
Dimitri C.

23
การทำตามข้อ จำกัด REST ไม่ใช่เรื่องง่าย การบีบการดำเนินธุรกิจที่ซับซ้อนออกเป็นคำกริยามาตรฐานสี่คำนั้นยากจริง ๆ บางครั้ง อย่างไรก็ตามเมื่อทำได้ดีผลลัพธ์ที่ได้นั้นง่ายที่จะเข้าใจ แต่การไปถึงที่นั่นจะเป็นอะไรก็ได้
Darrel Miller

6
@Dimitri: "Simple" เพราะมันช่วยให้คุณมีกรอบการทำงานที่ง่าย REST คือ HTTP! มันง่ายกว่า SOAP (ซึ่งแม้จะมีความเรียบง่ายในชื่อของมัน) "ช่วยให้คุณจัดระเบียบ" - แนวคิดนั้นไม่ยากเกินกว่าที่จะเข้าใจและเมื่อนำไปใช้อย่างถูกต้องแล้วจะทำให้สิ่งต่าง ๆ เป็นไปด้วยดี REST อาจเป็นวิธีในการออกแบบแอพแทนรายละเอียดการใช้งาน ดังที่ Darrel ชี้ให้เห็นว่าการใช้งานอาจไม่ง่าย แต่ผลลัพธ์ที่ได้ก็เป็นรางวัล "ช่วยให้ลูกค้าใหม่ใช้แอปพลิเคชันของคุณได้ง่าย" - อีกครั้ง: REST คือ HTTP
Emil Ivanov

31

ใส่เพียง: NONE

รู้สึกอิสระที่จะ downvote แต่ฉันยังคงคิดว่าไม่มีผลประโยชน์ที่แท้จริงมากกว่า non-REST HTTP คำตอบปัจจุบันทั้งหมดไม่ถูกต้อง ข้อโต้แย้งจากคำตอบที่โหวตมากที่สุดในปัจจุบัน:

  • ง่าย
  • คุณสามารถใช้แคช HTTP และพร็อกซีเซิร์ฟเวอร์ได้เป็นอย่างดีเพื่อช่วยคุณจัดการภาระงานสูง
  • มันช่วยให้คุณสามารถจัดระเบียบแอพพลิเคชั่นที่ซับซ้อนมากให้เป็นแหล่งข้อมูลง่ายๆ
  • ช่วยให้ลูกค้าใหม่ใช้แอปพลิเคชันของคุณได้ง่ายแม้ว่าคุณจะไม่ได้ออกแบบมาเฉพาะสำหรับพวกเขา (อาจเป็นเพราะพวกเขาไม่ได้อยู่ใกล้ ๆ เมื่อคุณสร้างแอป)

1. ง่าย

ด้วย REST คุณต้องการเลเยอร์การสื่อสารเพิ่มเติมสำหรับฝั่งเซิร์ฟเวอร์และสคริปต์ฝั่งไคลเอ็นต์ => จริงๆแล้วมันซับซ้อนกว่าการใช้ HTTP ที่ไม่ใช่ REST

2. แคช

การแคชสามารถควบคุมได้โดยส่วนหัว HTTP ที่ส่งโดยเซิร์ฟเวอร์ REST จะไม่เพิ่มคุณสมบัติใด ๆ ที่ขาดหายไปในที่ไม่ใช่ REST

3. องค์กร

REST ไม่ได้ช่วยให้คุณจัดระเบียบสิ่งต่าง ๆ มันบังคับให้คุณใช้ API ที่สนับสนุนโดยไลบรารีฝั่งเซิร์ฟเวอร์ที่คุณใช้ คุณสามารถจัดระเบียบแอปพลิเคชันของคุณในลักษณะเดียวกัน (หรือดีกว่า) เมื่อคุณใช้วิธีการที่ไม่ใช่แบบ REST เช่นดูModel-View-ControllerหรือMVC เส้นทาง

4. ใช้งานง่าย / ใช้งาน

ไม่จริงเลย ทุกอย่างขึ้นอยู่กับว่าคุณจัดระเบียบและจัดทำเอกสารใบสมัครของคุณอย่างไร REST จะไม่ทำให้แอปพลิเคชันของคุณดีขึ้นอย่างน่าอัศจรรย์


3
โดยทั่วไปส่วนที่เหลือ apis ง่ายต่อการแคชเพราะคุณแยกข้อมูลออกเป็นทรัพยากรที่มีวงจรชีวิตเดียวกัน (ถูกสร้างและปรับปรุงในเวลาเดียวกัน) เพื่อให้คุณสามารถแคชและแคชได้อย่างน่าเชื่อถือในขณะที่ non-rest-apis มักจะส่งคืนข้อมูลที่ โพสต์ได้รับการประมวลผลอย่างมากหรือเป็นการรวมตัวกันของหลายหน่วยงานทำให้การแคชทำได้ยากขึ้น
Scott Schulthess

2
ถูกต้องมันไม่ได้เป็นเอกสิทธิ์เฉพาะบุคคลร่วมกัน (คุณสามารถมี API ที่ไม่ได้พักที่แคช) แต่การใช้วิธีการพักเพื่อสนับสนุนการออกแบบ API และในทางปฏิบัติมันมีความเกี่ยวข้องอย่างแน่นอนเพราะมันสนับสนุนแนวทางปฏิบัติที่ดีที่สุดต่างๆ )
Scott Schulthess

4
"REST ไม่ได้ช่วยให้คุณจัดระเบียบสิ่งต่าง ๆ ได้บังคับให้คุณใช้ API ที่ได้รับการสนับสนุนโดยไลบรารีฝั่งเซิร์ฟเวอร์ที่คุณใช้" ฉันไม่แน่ใจว่าคุณหมายถึงอะไร เป็นไปได้อย่างสมบูรณ์แบบ (และไม่ยากอีกต่อไปกว่าการสร้าง non-REST API) เพื่อสร้าง RESTful API โดยไม่ต้องใช้เฟรมเวิร์กฝั่งเซิร์ฟเวอร์เพิ่มเติม
Michael O.

2
"ด้วย REST คุณต้องการเลเยอร์การสื่อสารเพิ่มเติม" - humbug คุณสามารถใช้ไลบรารี HTTP ที่มีอยู่ได้
Søren Boisen

1
@ SørenBoisenคำตอบนี้เก่าไปหน่อย ฉันควรอัปเดตมันเพื่อสะท้อนสถานะปัจจุบันของสิ่งต่าง ๆ ให้มากขึ้น
Petr Peller

23

IMHO ข้อได้เปรียบที่ใหญ่ที่สุดที่ REST เปิดใช้คือลดการเชื่อมต่อไคลเอ็นต์ / เซิร์ฟเวอร์ มันง่ายกว่ามากในการพัฒนาส่วนต่อประสาน REST เมื่อเวลาผ่านไปโดยไม่ทำลายลูกค้าที่มีอยู่


4
คุณยกตัวอย่างได้ไหม ขอบคุณ!
ม.ค. Żankowski

3
นั่นจะไม่ขึ้นอยู่กับว่า API ที่ไม่ใช่ส่วนที่เหลือของคุณนั้นเสียหายเพียงใด?
johnny

@ Johnny เป็นไปได้ แต่ไม่น่าเป็นไปได้ ข้อ จำกัด ของ REST ได้รับเลือกให้เปิดใช้งานการวิวัฒนาการอย่างอิสระของส่วนประกอบต่างๆ หากคุณพบวิธีที่จะทำสิ่งนี้ให้ดีขึ้นโดยไม่ใช้ข้อ จำกัด เดียวกันฉันก็มั่นใจว่าผู้คนจำนวนมากอยากได้ยินเรื่องนี้
Darrel Miller

@DarrelMiller คุณช่วยกรุณาอธิบายได้ว่า REST ลดการเชื่อมต่อไคลเอนต์ / เซิร์ฟเวอร์ได้ดีกว่าวิธี Non REST http ได้อย่างไร? ฉันเชื่อว่าคุณกำลังชี้ไปยังจุดที่ Timmmm พูดในคำตอบของเขา / เธอ โปรดดูความคิดเห็นล่าสุดของฉันภายใต้คำตอบ
Timmmm

ระบบ @emilly REST ไม่พึ่งพาข้อมูล band เพื่อประมวลผลการตอบสนอง ไม่มีข้อสันนิษฐานที่ต้องทำเกี่ยวกับสิ่งที่อาจกลับมาจากคำขอเฉพาะ การตอบสนองจะบอกทุกสิ่งที่คุณจำเป็นต้องรู้ สิ่งนี้อนุญาตให้เซิร์ฟเวอร์เปลี่ยนพฤติกรรมและลูกค้าสามารถรับรู้การเปลี่ยนแปลงเหล่านั้นได้
Darrel Miller

15

การค้นพบ

แต่ละทรัพยากรมีการอ้างอิงไปยังแหล่งข้อมูลอื่น ๆ ไม่ว่าจะเป็นในลำดับชั้นหรือลิงก์ดังนั้นจึงสะดวกในการเรียกดู นี่คือข้อได้เปรียบที่มนุษย์พัฒนาลูกค้าประหยัดเขา / เธอจากการให้คำปรึกษาเอกสารและเสนอคำแนะนำอย่างต่อเนื่อง นอกจากนี้ยังหมายความว่าเซิร์ฟเวอร์สามารถเปลี่ยนชื่อทรัพยากรได้เพียงฝ่ายเดียว (ตราบใดที่ซอฟต์แวร์ไคลเอนต์ไม่ได้เข้ารหัส 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 ที่อาจหรืออาจไม่มีการเปลี่ยนแปลงจุดเชื่อมต่อเหล่านั้น คุณต้องอ่านเอกสารมากแค่ไหน

  • คุณสามารถทำนายการส่งคืนของแบบสอบถามล่าสุดได้หรือไม่

  • คุณต้องแก้ไขความเห็นที่โพสต์ (ก่อนที่จะลบ) คุณสามารถทำได้โดยไม่ตรวจสอบเอกสารหรือไม่


นี่ไม่ควรจะเป็นรายการที่ครบถ้วนสมบูรณ์และมีข้อได้เปรียบในทางปฏิบัติเพียงอย่างเดียว
BoppreH

นี่เป็นคำตอบที่ฉลาดมากฉันปรบมือ
EralpB

10

ฉันแนะนำให้ดูที่ Ryan Tomayko ของวิธีที่ฉันอธิบาย REST กับภรรยาของฉัน

การแก้ไขโดยบุคคลที่สาม

ข้อความที่ตัดตอนมาจากลิงค์ waybackmaschine:

ตัวอย่างเป็นอย่างไร คุณเป็นครูและต้องการจัดการนักเรียน:

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

หากระบบที่มีบนเว็บแล้วอาจมี URL student, teacher, class, book, room, etcสำหรับแต่ละคำนามที่เกี่ยวข้องที่นี่: ... หากมีการแสดงเครื่องที่สามารถอ่านได้สำหรับแต่ละ URL มันจะไม่สำคัญที่จะสลักเครื่องมือใหม่เข้าสู่ระบบเพราะข้อมูลทั้งหมดนั้นจะสิ้นเปลืองในแบบมาตรฐาน ... คุณสามารถสร้างระบบทั่วประเทศที่สามารถพูดคุยกับแต่ละระบบโรงเรียนเพื่อรวบรวมคะแนนการทดสอบ

แต่ละระบบจะรับข้อมูลจากกันและกันโดยใช้ HTTP GET อย่างง่าย หากระบบหนึ่งต้องการเพิ่มบางสิ่งในระบบอื่นระบบจะใช้ HTTP POST หากระบบต้องการอัปเดตบางอย่างในระบบอื่นระบบจะใช้ HTTP PUT สิ่งเดียวที่เหลือก็คือว่าข้อมูลควรมีลักษณะอย่างไร


6
ภรรยา:นี่เป็นอีกเรื่องของหุ่นยนต์หรือไม่
Tobu

4
นี่เป็นข้อความที่ดี แต่มันไม่ได้ยกตัวอย่างว่าทำไมการใช้ GET และ POST สำหรับทุกสิ่งจึงไม่ดี
Dimitri C.

9
นั่นเป็นเหตุผลที่ฉันพยายามค้นหาว่าทำไมจึงดีกว่า :-)
Dimitri C.

7
การเขียนถูกลบ
surfen


5

ฉันอยากจะแนะนำให้ทุกคนที่กำลังมองหาคำตอบสำหรับคำถามนี้ผ่าน"สไลด์โชว์"นี้

ฉันไม่เข้าใจว่า REST คืออะไรและทำไมมันถึงเย็นมากข้อดีและข้อเสียของมันแตกต่างจาก SOAP - แต่สไลด์โชว์นี้ยอดเยี่ยมและเข้าใจง่ายดังนั้นตอนนี้ฉันจึงชัดเจนกว่าเดิมมาก


3

เก็บเอาไว้.

มีประโยชน์เชิงลึกอื่น ๆ เพิ่มเติมของ REST ซึ่งหมุนรอบความสามารถในการวิวัฒนาการผ่านการแต่งงานกันแบบหลวม ๆ และไฮเปอร์เท็กซ์ แต่กลไกการแคชเป็นเหตุผลหลักที่คุณควรสนใจ RESTful HTTP


3
คุณสามารถยกตัวอย่างสิ่งที่แคชได้และทำไมการแคชจะไม่เกิดขึ้นกับโซลูชันที่ไม่ใช่ส่วนที่เหลือ
Dimitri C.

2
@Dimitri C: ลิงก์wikipedia.org/article?id=19จะไม่ถูกแคชโดยพร็อกซีเนื่องจากจะไม่สนใจพารามิเตอร์ที่ส่งผ่านไปยัง URL ในทางกลับกันลิงก์ wikipedia.org/RESTจะถูกแคชไว้เข้าใจไหม
รองประธาน

6
หากการแคชเป็นประโยชน์หลักของ REST ฉันสามารถรับรองได้ว่าฉันจะไม่ใช้เวลาสองปีที่ผ่านมาในการสร้างบริการ RESTful
Darrel Miller

ที่จริงแล้วคุณอาจจะสร้างระบบที่มีการกระจายในการเชื่อมต่อหลวมมีความสำคัญสูงสุด (สนใจที่จะรู้ว่าสิ่งที่ระบบเหล่านี้เป็น) แต่คนส่วนใหญ่ไม่ได้ - หรือพวกเขากำลังใช้เทคโนโลยี (เช่น เบราว์เซอร์และ html) ซึ่งส่วนใหญ่ทำงานหนักสำหรับพวกเขา
Mike

1
ดังนั้นทำไมไม่ใช้เพียงGET /get_article/19/และPOST /update_articleถ้าแคชเป็นข้อกังวลของคุณ คุณยังสามารถทำทุกอย่างที่มีเพียงGETและPOSTและผมเชื่อว่าRESTหมายถึง "การใช้งานGET, POST, PUTและDELETEเพียง." และไม่ใช่แค่ "อย่าใช้สตริงการสืบค้น" RESTดังนั้นสิ่งที่ผมแนะนำจะไม่เป็น จากนั้นอีกครั้งไม่มีใครสามารถยอมรับสิ่งที่REST เป็นจริงดังนั้นฉันวางไว้ในถังด้วย "Web 2.0"
Timmmm

3

มันเขียนลงในวิทยานิพนธ์ฟีลดิง แต่ถ้าคุณไม่ต้องการอ่านมาก:

  • ขยายขีดความสามารถได้มากขึ้น (เนื่องจากไร้สัญชาติ, แคชและข้อ จำกัด ของระบบเลเยอร์
  • แยกไคลเอนต์และเซิร์ฟเวอร์ (เนื่องจากข้อ จำกัด อินเทอร์เฟซที่ไร้สัญชาติและ จำกัด )
    • ลูกค้าที่ใช้ซ้ำได้ (ลูกค้าสามารถใช้เบราว์เซอร์ REST ทั่วไปและซีแมนทิกส์ RDF เพื่อตัดสินใจว่าลิงก์ใดที่ควรติดตามและวิธีแสดงผลลัพธ์)
    • ไคลเอ็นต์ไม่แบ่ง (ไคลเอนต์หยุดพักโดยการเปลี่ยนแปลงความหมายเฉพาะแอปพลิเคชันเนื่องจากพวกเขาใช้ซีแมนทิกส์แทนความรู้เฉพาะ API บางส่วน)

0
  • ให้ ID "ทรัพยากร" ทุกครั้ง
  • เชื่อมโยงสิ่งต่าง ๆ เข้าด้วยกัน
  • ใช้วิธีการมาตรฐาน
  • ทรัพยากรที่มีตัวแทนหลายรายการ
  • สื่อสารอย่างไร้สัญชาติ

เป็นไปได้ไหมที่จะทำทุกอย่างด้วย POST และ GET? ใช่มันเป็นแนวทางที่ดีที่สุดหรือไม่? ไม่ทำไม? เพราะเรามีวิธีการมาตรฐาน หากคุณคิดอีกครั้งมันเป็นไปได้ที่จะทำทุกอย่างโดยใช้เพียงแค่รับ .. ดังนั้นทำไมเราถึงต้องใช้ POST ด้วยซ้ำ เพราะมาตรฐาน!

ตัวอย่างเช่นวันนี้กำลังคิดถึงโมเดล MVC คุณสามารถ จำกัด แอปพลิเคชันของคุณเพื่อตอบสนองต่อคำกริยาเฉพาะชนิดเช่น POST, GET, PUT และ DELETE แม้ว่าทุกสิ่งทุกอย่างจะถูกโพสต์และรับภายใต้ประทุนไม่เหมาะสมที่จะมีคำกริยาที่แตกต่างกันสำหรับการกระทำที่แตกต่างกันใช่ไหม


1
"เป็นไปได้ที่จะทำทุกอย่างโดยใช้ GET": ฉันทำการทดลองกับ HTTP GET ใน Silverlight แล้ว ข้อสรุปของฉันคือข้อความ GET มีขนาดที่ จำกัด อย่างมากในขณะที่ข้อความ POST อาจใหญ่กว่าเดิม (อีกครั้ง: ในการตั้งค่า Silverlight) ดังนั้นฉันจะเลือกใช้ HTTP POST สำหรับทุกสิ่ง! :-)
Dimitri C.

โซลูชั่นทั้งสองนั้นขัดต่อมาตรฐาน ทำทุกอย่างผ่าน POST ไม่ดีโดยเฉพาะอย่างยิ่งข้อความค้นหา โปรดทราบว่าในปีที่ผ่านมาเครื่องมือค้นหาทั้งหมดที่ใช้ในการทำงานเป็น GET จะทำงานเป็น GET ทันที ทำไม? เพราะวิธี "รับ" มีความสามารถในการรับ spidered ...
VP

0

การค้นพบนั้นง่ายกว่าใน REST เรามีเอกสาร WADL (คล้ายกับ WSDL ใน webservices แบบดั้งเดิม) ที่จะช่วยให้คุณโฆษณาบริการของคุณไปทั่วโลก คุณสามารถใช้การค้นพบ UDDI ได้เช่นกัน ด้วย HTTP POST และ GET แบบดั้งเดิมผู้คนอาจไม่ทราบคำขอข้อความและสกีมาตอบกลับของคุณเพื่อโทรหาคุณ


1
การอธิบายบริการเว็บ RESTful ด้วยเอกสาร WADL เอาชนะหนึ่งในข้อได้เปรียบหลักของ REST โดยเฉพาะข้อดีทั้งหมดที่ได้จากไฮเปอร์สื่อ
โทมัส Eizinger

@ThomasEizinger WADL ช่างเป็นเรื่องที่ไม่ดีจริง ๆ หรือ? ขณะนี้เรากำลังทำงานกับ บริษัท อื่นที่ไม่ได้ระบุ WADL ไว้ด้านบนจะส่งคืน json-objects ขึ้นอยู่กับสิ่งที่เราร้องขอ ฉันคิดว่า WADL จะเป็นประโยชน์ในการคิดอย่างชัดเจน
surfmuggle

WADL ทำงานได้อย่างยอดเยี่ยมในการอธิบาย HTTP API เนื่องจากเป็นสิ่งที่ออกแบบมา ขึ้นอยู่กับบริการของ บริษัท นี้ WADL อาจเป็นหรือไม่เป็นความคิดที่ดี หากบริการไม่ได้ใช้ประโยชน์จากสื่อหลายมิติและเพียงทำให้วัตถุบางอย่างเป็นอนุกรมใน JSON พวกเขาควรจัดทำเอกสาร (WADL, Swagger และอื่น ๆ ) เกี่ยวกับการทำงานของบริการและสิ่งที่คาดหวัง / ส่งคืน WADL ต่อ se ไม่เลวเลยมันไม่ใช่เครื่องมือที่เหมาะสมสำหรับ webservice RESTful (แท้จริง)
Thomas Eizinger

0

ข้อดีอย่างหนึ่งคือเราสามารถประมวลผลเอกสาร XML แบบไม่ต่อเนื่องและข้อมูล unmarshal XML จากแหล่งต่าง ๆ เช่นวัตถุ InputStream, URL, โหนด DOM ...


0

@ 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 นั้นโดยพื้นฐานแล้วการออกแบบที่เรียบง่าย - แต่นี่ไม่ได้หมายความว่าการออกแบบนั้นเรียบง่าย คุณเห็นความแตกต่างหรือไม่ คุณจะต้องคิดมากเกี่ยวกับแนวคิดที่แอปพลิเคชันของคุณจะเป็นตัวแทนและจัดการหากคุณต้องการสิ่งที่ต้องทำเพื่อที่จะนำเสนอสิ่งนี้โดยใช้ทรัพยากร แต่ถ้าคุณทำเช่นนั้นคุณจะจบลงด้วยการออกแบบที่เรียบง่ายและมีประสิทธิภาพมากขึ้น


-1

เครื่องมือค้นหาสามารถละเว้นข้อความค้นหาได้


8
การใช้สตริงข้อความค้นหานั้นสงบ
Emil Ivanov

ตอนนี้, เครื่องมือค้นหาบางตัวไม่สนใจลิงค์แบบไดนามิก ไม่มากอีกต่อไป แต่ก็ยังขมวดคิ้วเมื่อ หากคุณเรียกใช้ไซต์เล็ก ๆ Googlebot อาจไม่จัดทำดัชนีหน้าเว็บทั้งหมดของคุณหากมีเครื่องหมายคำถามอยู่ในเส้นทาง
Wisty

3
... ซึ่งเป็นเท็จเพียงชัดแจ้งเมื่อคุณพูดถึง Google: googlewebmastercentral.blogspot.com/2008/09/…
Boldewyn

-1 สำหรับ Query-strings จะไม่ถูกละเว้นโดยเครื่องมือค้นหา webmasters.googleblog.com/2008/09/…
ชายบรอนซ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.