วิธีที่เหมาะสมในการทำ REST คืออะไร


36

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

ดังนั้นคำถามของฉันคือวิธีที่เหมาะสมในการทำ REST คืออะไร


1
ดูเหมือนว่าแท็ก wiki ของ Stack Overflowจะใกล้เคียงกับทรัพยากรของ Canonical ในบริบทของเครือข่าย Stack Exchange
gnat

17
ฉันเพิ่งหลับตาสักครู่ ... อาจไปขี่จักรยานแล้วก็นอนลง
Edward Strange

REST ไม่ใช่เพียงแค่ใช้ URL เช่น mydomain.com/accounts และกริยา HTTP เพื่อเรียกใช้การดำเนินการใช่หรือไม่ คำกริยาระบุว่าคุณต้องการรับสร้างอัปเดตหรือลบข้อมูลที่ไหน เมื่อฉันคิดว่าส่วนที่เหลือนั่นคือสิ่งที่ฉันคิด
มัฟฟินแมน

2
@ นิคนั่นคือการตีความที่พบบ่อยที่สุด 'ของจริง' เป็นเรื่องยากมากที่จะคร่ำครวญและ (เท่าที่ฉันสามารถบอกได้) ยากที่จะหาสิ่งที่นำมาใช้จริงได้ทุกที่ ... (ดูคำตอบของ Wilk)
Benjol

3
@ Nick ความเข้าใจของคุณไม่ได้เป็นส่วนที่เหลือก็เป็นRPC ผ่าน HTTP

คำตอบ:


30

มีหลายวิธีในการเรียนรู้วิธีสร้างแอปพลิเคชันเว็บสงบและไม่ไม่มีวิธีที่ไม่ซ้ำกัน RESTful ไม่ใช่มาตรฐาน แต่ใช้ชุดของมาตรฐาน (HTTP, URI, Mime Type, ... )

เริ่มต้นด้วยสิ่งนี้: ฉันอธิบายได้อย่างไรกับภรรยาของฉัน

จากนั้นดำเนินการดังนี้: RESTful Web Services Cookbook

จากนั้นใช้ความพยายามทั้งหมดในการพัฒนาเว็บแอปพลิเคชันเพราะวิธีที่ดีที่สุดในการเรียนรู้คือทำการทดลองและคุณสามารถเรียนรู้มากมายจากความผิดพลาดของคุณ;)

ไม่ต้องกังวลถ้าเว็บแอปแรกของคุณจะไม่สงบอย่างสมบูรณ์: คุณจะพบวิธีที่จะทำ!

ดังนั้นการอ้างถึงโอบิวันเคโนบีว่า "พลังอาจอยู่กับคุณ!" ;)

แก้ไข

ตกลงให้ฉันเจาะจงมากขึ้น คุณต้องการสร้าง webapp ที่สงบแล้วใช่ไหม อย่างที่ฉันบอกว่ามีหลายวิธีที่จะทำ แต่นี่คือแนวทางหลัก

คำนิยาม

REST (Representational State Transfer)เป็นรูปแบบสถาปัตยกรรมซอฟต์แวร์สำหรับระบบแบบกระจาย (เช่น WWW) ไม่ใช่มาตรฐาน แต่ใช้ชุดของมาตรฐาน: HTTP, AJAX, HTML, URI, Mime Type เป็นต้นเรากำลังพูดถึงการเป็นตัวแทนของทรัพยากรไม่ใช่เกี่ยวกับทรัพยากรเอง นำมาจาก 'วิธีที่ฉันอธิบายส่วนที่เหลือกับภรรยาของฉัน':

ภรรยา : หน้าเว็บเป็นแหล่งข้อมูลใช่ไหม

ไรอัน : ชนิดของ หน้าเว็บเป็นตัวแทนของทรัพยากร ทรัพยากรเป็นเพียงแนวคิด

ข้อ จำกัด ของสถาปัตยกรรม

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

ชุดอินเตอร์เฟส

  • การระบุทรัพยากร ' : แต่ละทรัพยากรจะต้องมีการระบุโดย URI
  • โพรโทคอล : เพื่อที่จะได้รับในไคลเอนต์การสื่อสารและเซิร์ฟเวอร์โปรโตคอลจะต้องทำก่อน แต่ละคำขออาจมีประเภท MIME ที่เหมาะสม (แอปพลิเคชัน / xml, ข้อความ / html, แอปพลิเคชัน / rdf + xml, ฯลฯ ) ส่วนหัวด้านขวาและวิธี HTTP ที่ถูกต้อง (ดูคำอธิบาย CRUD ด้านล่าง)

CRUD

ตกลงเราเห็นว่าในการระบุทรัพยากรที่เราสามารถใช้ URI แต่เราต้องการสิ่งอื่นสำหรับการกระทำ (เพิ่มแก้ไขลบ ฯลฯ ): ยินดีต้อนรับสู่ CRUD (สร้างอ่านอัปเดตและลบ)

  • สร้าง { HTTP: POST } { SQL: INSERT } => สร้างทรัพยากรใหม่
  • อ่าน { HTTP: GET } { SQL: SELECT } => รับทรัพยากร
  • อัปเดต { HTTP: PUT } { SQL: UPDATE } => แก้ไขทรัพยากร
  • ลบ { HTTP: DELETE } { SQL: DELETE } => ลบทรัพยากร

ตอนนี้เกี่ยวกับ PUT และ DELETE ปัญหาเทคโนโลยีบางอย่างอาจปรากฏขึ้น (คุณจะได้รับพวกเขาด้วยรูปแบบ HTML): นักพัฒนามักจะข้ามปัญหานี้โดยใช้ POST สำหรับแต่ละคำขอ 'PUT' และ 'DELETE' อย่างเป็นทางการคุณต้องใช้ PUT และ DELETE โดยวิธีการทำสิ่งที่คุณต้องการ ประสบการณ์ของฉันผลักดันให้ฉันใช้ POST และรับทุกครั้ง

--- ควรใช้ส่วนต่อไป แต่ไม่ใช่พันธะของ REST: มันเกี่ยวข้องกับข้อมูลที่เชื่อมโยง ---

URI

URI นามธรรมจากรายละเอียดทางเทคนิค! บอกลา URI ดังนี้:

http://www.example.com/index.php?query=search&id=9823&date=08272012

ออกแบบ URI อีกครั้ง! ใช้ลิงค์ด้านบนและเปลี่ยนดังต่อไปนี้:

http://www.example.com/search/2012/08/27/9823

มันดีกว่ามากใช่มั้ย สามารถทำได้โดย:

  • แอ็พพลิเคชันเซิร์ฟเวอร์ : ไฟล์รูทที่จัดเส้นทางแต่ละคำร้องขอ
  • เว็บเซิร์ฟเวอร์ : ไฟล์. htaccess รวมถึงกฎการเขียนซ้ำ
  • แอปพลิเคชันไคลเอนต์ : วัตถุประวัติ HTML5หรือแฟรกเมนต์ (เช่น Twitter ใช้แฟรกเมนต์: http://www.twitter.com/#!/__wilky__ )

อีกสิ่งหนึ่ง: ใช้ URI ที่แตกต่างเพื่อแสดงทรัพยากรที่แตกต่าง:

ให้ความสนใจ : about.html และ about.rdf ไม่ใช่ไฟล์! พวกเขาอาจเป็นผลมาจากการแปลง XSLT!

การเจรจาต่อรองเนื้อหา

หากคุณมาถึงจุดนี้ขอแสดงความยินดี! อาจเป็นไปได้ว่าคุณพร้อมที่จะรับแนวคิดที่เป็นนามธรรมมากขึ้นเพราะเรากำลังเข้าสู่รายละเอียดทางเทคนิคของเว็บความหมาย;) ดีเมื่อลูกค้าของคุณต้องการทรัพยากรมันมักจะทำให้คำขอดังต่อไปนี้:

GET http://www.example.com/about
Accept: application/rdf+xml

แต่เซิร์ฟเวอร์จะไม่ตอบสนองด้วย about.rdf เนื่องจากมี URI อื่น ( http://www.example.com/about.rdf ) มาดูรูปแบบ 303 กันเถอะ! เซิร์ฟเวอร์จะส่งคืนสิ่งนี้:

303 See Other
Location: http://www.example.com/about.rdf

และลูกค้าจะตามลิงค์กลับมาดังนี้:

GET http://www.example.com/about.rdf
Accept: application/rdf+xml

ในที่สุดเซิร์ฟเวอร์จะส่งคืนทรัพยากรที่ร้องขอ:

200 OK
about.rdf

ไม่ต้องกังวล: แอปพลิเคชันไคลเอนต์ของคุณจะไม่ทำสิ่งนี้! รูปแบบ 303 ต้องทำโดยแอปพลิเคชันเซิร์ฟเวอร์และเบราว์เซอร์ของคุณจะจัดการส่วนที่เหลือ;)

ข้อสรุป

บ่อยครั้งที่ทฤษฎีอยู่ไกลจากการฝึกฝน ใช่ตอนนี้คุณรู้วิธีออกแบบและพัฒนาแอปพลิเคชั่น RESTful แล้ว แต่แนวทางข้างต้นเป็นเพียงคำใบ้ คุณจะพบวิธีที่ดีที่สุดในการสร้างเว็บแอปพลิเคชันและอาจไม่เหมือนที่ทฤษฎีต้องการ อย่าให้มันแช่ง: D!

บรรณานุกรม

สงบเงียบบริการเว็บ, Sameer Tyagi

REST API ต้องเป็น Roy Hyperfield ซึ่งเป็นตัวขับเคลื่อน

บริการเว็บสงบ: พื้นฐาน, Alex Rodriguez

Webber REST เวิร์กโฟลว์


1
คุณอาจลองเพิ่มลิงค์นี้ซึ่งเป็นคู่มือที่สมบูรณ์ที่สุดที่ฉันเคยพบ
Benjol

ฉันเคยเห็น PUT และ POST ใช้กับความหมายของพวกเขาที่แลกเปลี่ยน (ที่สัมพันธ์กับคำตอบของคุณ): POST -> create, PUT -> update ความคิดใดที่ใช้ความหมายกันอย่างแพร่หลายมากขึ้น?
Andres F.

@Andres F .: jcalcote.wordpress.com/2008/10/16/…พูดว่า: Create = PUT ถ้าคุณกำลังส่งเนื้อหาทั้งหมดของทรัพยากรที่ระบุ (URL) สร้าง = POST ถ้าคุณส่งคำสั่งไปยังเซิร์ฟเวอร์เพื่อสร้างทรัพยากรที่ระบุโดยใช้อัลกอริทึมฝั่งเซิร์ฟเวอร์ Update = PUT ถ้าคุณกำลังอัพเดทเนื้อหาทั้งหมดของทรัพยากรที่ระบุ Update = POST หากคุณร้องขอให้เซิร์ฟเวอร์อัพเดทผู้ใต้บังคับบัญชาหนึ่งรายหรือมากกว่าของทรัพยากรที่ระบุ
Wilk

@Benjol: ฉันจะแก้ไขด้วยข้อเสนอแนะของคุณ;) ขอบคุณ!
Wilk

1
@ Wilk มีหลายสิ่งที่ต้องพิจารณา! อาจเป็นเหตุผลว่าทำไมไม่มีใครได้รับสิทธิ์นี้: P
Andres F.

5

หนังสือพระคัมภีร์ REST หรือบางสิ่งบางอย่าง ....

ไม่จำเป็นต้องมีหนังสือพระคัมภีร์ ฉันมีคำถามที่เหมือนกันและเรียนรู้ทุกสิ่งที่ฉันต้องการหรือต้องการทราบเกี่ยวกับ REST โดยการอ่านบทความทั้งสามนี้:

  1. ข้อมูลเบื้องต้นเกี่ยวกับ HTTP และ REST ของผู้เริ่มต้นจาก Net Tuts +
  2. บริการเว็บสงบ: พื้นฐานจาก IBM developerWorks
  3. RESTful HTTP ในทางปฏิบัติจาก InfoQ

แต่ฉันต้องการที่จะทำมันถูกต้อง

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

รู้ถึงความแตกต่างระหว่าง PUT และ POSTและใช้เมื่อใด GET, PUT และ DELETE ควรเป็นธุรกรรม idempotent, POST ไม่ควร

นอกจากนี้ให้ใช้รหัสสถานะ HTTPอย่างถูกต้องเมื่อสื่อสารกลับไปที่ไคลเอ็นต์

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