คำกริยาและการกระทำ RESTful url ที่ดีที่สุด / ทั่วไปคืออะไร


86

ฉันกำลังพยายามค้นหาข้อมูลบางอย่างเกี่ยวกับการดำเนินการ RESTful url ที่ดีที่สุดและพบบ่อยที่สุด

ตัวอย่างเช่นคุณใช้ URL ใดในการแสดงรายละเอียดของรายการเพื่อแก้ไขรายการอัปเดต ฯลฯ

/question/show/<whatever>
/question/edit/<whatever>
/question/update/<whatever> (this is the post back url)
/question/list   (lists the questions)

อืม. ขอบคุณทุกคนที่ช่วย :)

คำตอบ:


174

ใช้ URL เพื่อระบุวัตถุของคุณไม่ใช่การกระทำของคุณ:

โปรดทราบว่าสิ่งที่คุณพูดถึงครั้งแรกไม่ใช่สิ่งที่น่ารังเกียจ:

/questions/show/<whatever>

คุณควรใช้ URL ของคุณเพื่อระบุวัตถุของคุณแทน:

/questions/<question>

จากนั้นคุณดำเนินการอย่างใดอย่างหนึ่งด้านล่างกับทรัพยากรนั้น


รับ:

ใช้เพื่อรับทรัพยากรค้นหารายการทรัพยากรและเพื่อสอบถามข้อมูลแบบอ่านอย่างเดียวบนทรัพยากร

ในการขอรับทรัพยากรคำถาม:

GET /questions/<question> HTTP/1.1
Host: whateverblahblah.com

ในการแสดงรายการทรัพยากรคำถามทั้งหมด:

GET /questions HTTP/1.1
Host: whateverblahblah.com

โพสต์:

ใช้เพื่อสร้างทรัพยากร

โปรดทราบว่าต่อไปนี้เป็นข้อผิดพลาด:

POST /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

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

คุณควรทำสิ่งนี้เพื่อสร้างทรัพยากรโดยใช้ POST:

POST /questions HTTP/1.1
Host: whateverblahblah.com

โปรดทราบว่าในกรณีนี้ไม่ได้ระบุชื่อทรัพยากรเส้นทาง URL ของออบเจ็กต์ใหม่จะถูกส่งคืนให้คุณ

ลบ:

ใช้เพื่อลบทรัพยากร

DELETE /questions/<question> HTTP/1.1
Host: whateverblahblah.com

วาง:

ใช้เพื่อสร้างทรัพยากรหรือเขียนทับในขณะที่คุณระบุ URL ของทรัพยากร

สำหรับทรัพยากรใหม่:

PUT /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

ในการเขียนทับทรัพยากรที่มีอยู่:

PUT /questions/<existing_question> HTTP/1.1
Host: whateverblahblah.com

... ใช่พวกเดียวกัน PUT มักถูกอธิบายว่าเป็นวิธีการ 'แก้ไข' เช่นเดียวกับการแทนที่ทรัพยากรทั้งหมดด้วยเวอร์ชันที่มีการเปลี่ยนแปลงเล็กน้อยคุณได้แก้ไขสิ่งที่ไคลเอ็นต์จะได้รับเมื่อทำครั้งต่อไป


การใช้ REST ในรูปแบบ HTML:

HTML5 ข้อมูลจำเพาะกำหนด GET และ POST สำหรับองค์ประกอบแบบฟอร์ม

แอตทริบิวต์เนื้อหาวิธีการเป็นแอตทริบิวต์ที่แจกแจงด้วยคำสำคัญและสถานะต่อไปนี้:

  • คีย์เวิร์ด GET แมปกับสถานะ GET ระบุเมธอด HTTP GET
  • คีย์เวิร์ด POST แมปกับสถานะ POST ซึ่งระบุเมธอด HTTP POST

ในทางเทคนิคข้อกำหนด HTTP ไม่ได้ จำกัด ให้คุณใช้เฉพาะวิธีการเหล่านั้นเท่านั้น คุณมีอิสระในทางเทคนิคที่จะเพิ่มวิธีการใด ๆ ที่คุณต้องการแม้ว่าในทางปฏิบัตินี่ไม่ใช่ความคิดที่ดี แนวคิดก็คือทุกคนรู้ว่าคุณใช้ GET เพื่ออ่านข้อมูลดังนั้นมันจะทำให้เกิดความสับสนหากคุณตัดสินใจที่จะใช้ READ แทน ที่บอกว่า ...

ปะ:

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

PATCH /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

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


สวัสดีไบรอัน .. ยิ่งฉันอ่านข้อความนี้มากเท่าไหร่ ฉันสมมติว่าบางเบราว์เซอร์ (หรือเบราว์เซอร์เวอร์ชัน) ไม่รองรับ PUT หรือ DELETE? ถ้าเป็นเช่นนั้นเราจะใช้ POST แทนหรือไม่?
Pure.Krome

1
สวัสดี Pure.Knome; เว็บเบราว์เซอร์รองรับพวกเขาทั้งหมดรวมถึงไลบรารี HTTP ใด ๆ ก็ควรรองรับทั้งหมดเช่นกัน
Brian R.Bondy

4
ฉันอยากจะแนะนำให้ซื้อหนังสือเล่มนี้หากคุณต้องการเรียนรู้ทั้งหมดเกี่ยวกับ REST oreilly.com/catalog/9780596529260
Brian R.Bondy

1
@ ไบรอัน: คำถามเพิ่มเติมเกี่ยวกับตัวอย่าง PUT ของคุณ >> PUT / questions / <new_question> ทำไมคุณถึงทำเช่นนั้นแทนที่จะทำ >> PUT / questions / เนื่องจากข้อมูลทั้งหมดในแบบฟอร์มจะถูกใช้เพื่อสร้างทรัพยากรใหม่ (แสดงความคิดเห็นต่อไป) ...
Pure.Krome

1
@Brian R.Bondy ขอบคุณสำหรับคำตอบที่ดี คำขอ POST ไปยังทรัพยากรที่มีอยู่ถูกอธิบายว่า "ต่อท้าย" ในหนังสือพักผ่อนของ oreilly (pg: 100,101) ซึ่งตรงกันข้ามกับคำว่า "แก้ไข" ทั่วไปของคุณ ท้ายที่สุดแล้วการต่อท้ายมีความเฉพาะเจาะจงมากกว่าการแก้ไขซึ่งอาจสื่อถึง "PUT ไปยังทรัพยากรที่มีอยู่" และในทางความหมายก็ฟังดูถูกต้องกว่าสำหรับ POST - การเพิ่มทรัพยากรใหม่ลงในลิงก์ที่ระบุไม่ว่าจะโดยการต่อท้ายหรือสร้างทรัพยากรย่อย .
Özgür

11

สมมติว่า/questions/10เป็นคำถามที่ถูกต้องแล้วจึงใช้วิธีการโต้ตอบกับมัน

โพสต์เพื่อเพิ่มเข้าไป

PUT เพื่อสร้างหรือแทนที่

รับเพื่อดู / สอบถาม

และ DELETE ไป .. ลบมัน

URL ไม่เปลี่ยนแปลง


4
ไม่ถูกต้อง. PUT ต้องมีความสำคัญ คุณต้องสามารถทำการร้องขอ PUT เดียวกันได้หลายครั้งโดยจะไม่มีผลใด ๆ หลังจากครั้งแรก ดังนั้นการสร้างทรัพยากรด้วยคำขอ PUT ทุกครั้งจึงไม่จำเป็น
aehlke

3
"Methods PUT และ DELETE ถูกกำหนดให้เป็น idempotent ซึ่งหมายความว่าคำขอที่เหมือนกันหลายรายการควรมีผลเช่นเดียวกับคำขอเดียว" การใช้ put ที่ URI ที่ไม่ได้ทำให้ Resource พร้อมใช้งานในขณะนี้สามารถสร้าง resouce ได้ การใส่อีกครั้งในทันทีจะทำอีกครั้งซึ่งจะไม่มีผลใด ๆ ด้วยวิธีนี้คุณกำลังสร้างทรัพยากร แต่แบบสอบถามยังคงเป็นประโยชน์ หากคุณกลับมาและต้องการเปลี่ยนทรัพยากรในภายหลังคุณจะต้อง PUT ไปยัง URI เดียวกันด้วยข้อมูลที่แตกต่างกัน (ซึ่งจะเป็นคำขอที่แตกต่างกันและสามารถทำซ้ำกี่ครั้งก็ได้โดยให้ผลลัพธ์เดียวกัน)
Allain Lalonde

1
อันที่จริงลองดูคำตอบที่ได้รับ 25 คะแนนข้างต้นระบุว่า PUT สามารถใช้เพื่อสร้างหรือแทนที่ทรัพยากรได้
Allain Lalonde

3
การสร้างจะใช้งานได้ตราบเท่าที่อนุญาตให้ระบุ ID ของทรัพยากรใหม่ แม้ว่าจะเป็นไปได้ แต่ผู้ใช้มักจะโพสต์ไปที่ / รวบรวมและส่งคืนลิงก์ที่มีรหัสใหม่:
pgraham

2
@aehIke การสร้างรีซอร์สใหม่โดย PUT ไม่ได้ทำให้เป็นไอเท็มที่ไม่มีอยู่จริงเนื่องจากแนวคิดก็คือถ้าฉัน 'PUT / items / 10' และไอเท็ม 10 ไม่มีอยู่ก่อนหน้านั้นก็จะถูกสร้าง อย่างไรก็ตามหากฉัน 'PUT / items / 10' อีกครั้งเป็นครั้งที่สองตอนนี้มันมีอยู่แล้วดังนั้นมันจะถูกแทนที่ด้วยเหตุนี้ความเป็นส่วนตัวจะถูกเก็บรักษาไว้เนื่องจากคำขอ PUT ที่ตามมาจะไม่มีผลข้างเคียงใหม่ (แน่นอนว่าสมมติว่าฉันยังคงใส่รายการเดิมทุกครั้ง)
Alappin

3

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

เนื่องจาก Rails ได้รับความนิยมอย่างมากในรูปแบบ URL ที่คุณดูเหมือนจะสนใจฉันจึงขอเสนอด้านล่างการดำเนินการของคอนโทรลเลอร์เริ่มต้นที่สร้างโดยScaffoldingGeneratorใน Ruby on Rails สิ่งเหล่านี้น่าจะคุ้นเคยกับทุกคนที่ใช้แอปพลิเคชัน Rails

การดำเนินการและมุมมองแบบนั่งร้าน ได้แก่ ดัชนีรายการแสดงใหม่สร้างแก้ไขปรับปรุงทำลาย

โดยปกติคุณจะสร้างสิ่งนี้เป็น:

http://application.com/controller/<action>/<id>

5
อนุสัญญา URI นอกวงดนตรีจะไม่สงบ อ้างถึง Fielding ตัวเอง: "REST API ต้องไม่กำหนดชื่อหรือลำดับชั้นของทรัพยากรคงที่ (การเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์ที่ชัดเจน) เซิร์ฟเวอร์ต้องมีอิสระในการควบคุมเนมสเปซของตนเอง แต่อนุญาตให้เซิร์ฟเวอร์สั่งไคลเอ็นต์เกี่ยวกับวิธีสร้าง URI ที่เหมาะสม เช่นทำในรูปแบบ HTML และเทมเพลต URI โดยกำหนดคำแนะนำเหล่านั้นภายในประเภทสื่อและความสัมพันธ์ของลิงก์ .. "
aehlke

1

นี่คือการแมป URL ปัจจุบันของคุณโดยใช้หลักการ REST:

/question/show/<whatever>

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

GET /question/<whatever>

/question/edit/<whatever>

ตอนนี้คุณต้องการให้ผู้ใช้ของคุณมีมุมมองอื่นของทรัพยากรเดียวกันที่อนุญาตให้เขาแก้ไขทรัพยากรได้ (อาจมีการควบคุมแบบฟอร์ม)

สองตัวเลือกที่นี่แอปพลิเคชันของคุณคือแอปพลิเคชัน (ไม่ใช่เว็บไซต์) จากนั้นคุณอาจใช้ JavaScript เพื่อเปลี่ยนทรัพยากรให้เป็นทรัพยากรที่แก้ไขได้บนฝั่งไคลเอ็นต์

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

GET /question/<whatever>;edit

/question/update/<whatever> (this is the post back url)

นี่คือการเปลี่ยนคำถามดังนั้น PUT จึงเป็นวิธีที่ถูกต้องในการใช้:

PUT /question/<whatever>

/question/list   (lists the questions)

รายการคำถามเป็นแหล่งข้อมูลหลักของคำถามดังนั้นจึงเป็นเรื่องปกติ:

GET /question

ตอนนี้คุณอาจต้องการเพิ่มเติม:

POST /question (create a new question and returns its URL)
DELETE /question/<whatever> (deletes a question if this is relevant)

ทาด้า :)


-1

สี่ตัวอย่างของคุณอาจเป็น:

GET /questions/123
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
GET /questions

ในการเพิ่มคำถาม:

POST /questions q=What+is+the+meaning+of+life

เซิร์ฟเวอร์จะตอบสนอง:

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