แบบแผน REST URI - ชื่อทรัพยากรเอกพจน์หรือพหูพจน์ขณะสร้าง


529

ฉันยังใหม่กับ REST และฉันสังเกตเห็นว่าในบริการ RESTful บางอย่างพวกเขาใช้ URI ทรัพยากรที่แตกต่างกันสำหรับการอัปเดต / รับ / ลบและสร้าง เช่น

  • การสร้าง - การใช้/ ทรัพยากรด้วยวิธีการ POST (สังเกตพหูพจน์) ในบางสถานที่การใช้/ ทรัพยากร (เอกพจน์)
  • ปรับปรุง - ใช้/ ทรัพยากร / 123ด้วยวิธีการ PUT
  • รับ - การใช้/ ทรัพยากร / 123ด้วยวิธีการ GET

ฉันสับสนเล็กน้อยเกี่ยวกับแผนการตั้งชื่อ URI นี้ เราควรใช้พหูพจน์หรือเอกพจน์เพื่อสร้างทรัพยากรอะไร เกณฑ์ที่ควรตัดสินใจในขณะนั้นคืออะไร


9
ต่อไปนี้หัวข้อนี้ผมได้รวบรวมตัวอย่างบางส่วนของ API REST ที่มีชื่อเสียงในบทความ: inmensosofa.blogspot.com/2011/10/...
jjmontes

3
ข้อสรุปที่ฉันได้รับหลังจากอ่านคำตอบทั้งหมดด้านล่าง: ใช้เอกพจน์เสมอเพราะ (a) มันสอดคล้องกัน (b) เชื่อมโยงกับชื่อชั้นและชื่อตารางโดยตรง (c) คำนามพหูพจน์บางอย่างผิดปกติ (คาดเดาไม่ได้) เป็นภาษาอังกฤษ
Will Sheppard

ดูคำตอบนี้สำหรับลิงก์ไปยังการตั้งชื่อตารางเอกพจน์และมีอีกบทความหนึ่งที่กล่าวถึงปัญหานี้แน่นอนDilemma ของ Rest API Developer - ขอบคุณ @Sorter
Will Sheppard

คำตอบ:


281

ข้อสมมติฐานของการใช้/resourcesคือมันแสดงถึงทรัพยากร "ทั้งหมด" หากคุณทำGET /resourcesคุณอาจจะกลับมาเก็บทั้งหมด โดย POSTing to /resourcesคุณกำลังเพิ่มลงในคอลเล็กชัน

อย่างไรก็ตามแต่ละทรัพยากรมีอยู่ที่ / ทรัพยากร หากคุณทำGET /resourceคุณอาจผิดพลาดเนื่องจากคำขอนี้ไม่สมเหตุสมผล แต่ก็/resource/123สมเหตุสมผลดี

ใช้/resourceแทนการ/resourcesจะคล้ายกับวิธีที่คุณจะทำเช่นนี้หากคุณกำลังทำงานกับกล่าวว่าระบบไฟล์และเก็บไฟล์และ/resourceเป็น directory "" กับบุคคล123, 456ไฟล์ในนั้น

ไม่ว่าจะถูกหรือผิดให้ไปกับสิ่งที่คุณชอบที่สุด


55
คำตอบที่ดี! แต่ไดเรกทอรี "เริ่มต้น" ใน Windows มีชื่อพหูพจน์ เช่นเดียวกับ "ไฟล์โปรแกรม", "ผู้ใช้", "เอกสาร", "วิดีโอ" ฯลฯ นอกจากนี้ฉันยังพบชื่อพหูพจน์ใน URL เว็บไซต์บ่อยขึ้น
Dmitry Gonchar

50
การประชุม defacto นั้นคนส่วนใหญ่และ APIs ที่นั่นทำอยู่เสมอคือทำให้เป็นพหูพจน์ตลอดเวลา รหัสระบุหนึ่งคันทรัพยากร / id
PositiveGuy

205
ไม่ว่าทางใดถูกหรือผิดไปกับสิ่งที่คุณชอบมากที่สุด. อาบรรทัดที่มีชื่อเสียงที่ฉันได้ยินบ่อยและป่วยและเบื่อที่จะได้ยินจากผู้คน การประชุมมีความสำคัญและควรได้รับการถกเถียงอย่างสร้างสรรค์ในหมู่ชุมชนนั่นคือสิ่งที่การแก้ปัญหาที่ดีขึ้นมาและแนวปฏิบัติที่ดี เมื่อคุณใช้ทั้งชื่อพหูพจน์และเอกพจน์สำหรับชื่อทรัพยากรใน URIs มันจะทำให้รหัสของคุณและ API ซับซ้อนขึ้นเพราะผู้ใช้และรหัสที่อยู่หลัง API ต้องคำนึงถึงเรื่องนั้นในเส้นทางและตรรกะเพื่อแยกความแตกต่างระหว่างเดี่ยวและพหูพจน์ พหูพจน์ตลอดเวลาคุณไม่มีปัญหา
PositiveGuy

30
@TomaszPluskiewicz คุณมีสิทธิ์ทั้งหมดที่ลูกค้าไม่สนใจ ในฐานะนักพัฒนาซอฟต์แวร์เราควรใส่ใจ - และสำหรับสิ่งที่ฉันเห็นด้วยกับความคิดเห็นของ WTF นั้นการอภิปรายเชิงสร้างสรรค์เกี่ยวกับการประชุมมีค่า
Travis D

12
ดังนั้นใครบางคนสามารถใส่คำตอบเดียวและยอมรับมันได้ดังนั้นฉันไม่ต้องอ่านทั้งหมด (อีกครั้ง)
เบ็นจอร์จ

623

สำหรับฉันดีกว่ามี schema ที่คุณสามารถแมปโดยตรงกับรหัส (ง่ายต่อการอัตโนมัติ) ส่วนใหญ่เป็นเพราะรหัสคือสิ่งที่จะเป็นที่ปลายทั้งสอง

GET  /orders          <---> orders 
POST /orders          <---> orders.push(data)
GET  /orders/1        <---> orders[1]
PUT  /orders/1        <---> orders[1] = data
GET  /orders/1/lines  <---> orders[1].lines
POST /orders/1/lines  <---> orders[1].lines.push(data) 

22
ความยากลำบากหรือความง่ายของสิ่งนี้เกิดจากการไม่เคารพ HATEOS ไม่สำคัญว่าจะเป็นพหูพจน์หรือเอกพจน์หรืออย่างอื่น คุณควรเคารพ uri ที่ส่งมาจากเซิร์ฟเวอร์ไม่ใช่ "build up" uri ของคุณบนไคลเอ็นต์ จากนั้นคุณมีการแมป 0 สิ่งที่ต้องทำสำหรับรหัสของคุณ
richard

7
@richard ไคลเอ็นต์ยังคงต้องทำการแมป ใน HATEOS พวกเขาจะต้องแมปกับชื่อที่แสดงถึงความสัมพันธ์ (rel) กับการก่อสร้าง URI rel, เมธอด (กริยา) และ Content-Type จากนั้นสร้างสื่อบันทึกรีซอร์ส สิ่งนี้ไม่ได้จำกัดความจำเป็นสำหรับการออกแบบ URI ที่ดี แม้ว่าไคลเอ็นต์อาจให้ความสำคัญกับชื่อ rel นักพัฒนาของ API ยังต้องการมาตรฐานที่มนุษย์อ่านได้ดีสำหรับการสร้าง URI

4
นี่เป็นคำตอบที่ดีกว่าในความคิดของฉัน ยกเว้นว่าฉันชอบใช้เอกพจน์แทนพหูพจน์เสมอ User.getList (), User.getById, User.delete เป็นต้น
Eastern Monk

3
ฉันชอบความเรียบง่าย การทำแผนที่ยังมีประโยชน์ในการทำเอกสารและการทดสอบบนเส้นทางที่ง่ายต่อการเขียนอย่างไม่น่าเชื่อ
delos

5
เรื่องนี้ทำให้รู้สึกถึงฉัน อย่างไรก็ตามเราเป็นร้านค้าฐานข้อมูลรายแรกซึ่งหมายความว่าเราสร้างรหัสและเอนทิตี api จากสคีมาฐานข้อมูลของเรา และมาตรฐานฐานข้อมูลมักจะสนับสนุนชื่อตารางเอกพจน์ดังนั้นเราจะไปกับมัน แต่ก็ยังอยู่ภายใต้ตรรกะเดียวกันกับคำตอบนี้
André C. Andersen

274

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


69
นี่คือคำตอบที่ดีที่สุดเท่าที่ฉันกังวล ฉันขอขอบคุณที่นักออกแบบ API ชอบความถูกต้องทางภาษาว่า "รับทรัพยากร # 123" แต่มันเป็นเรื่องยุ่งยากในการเขียนโค้ดเพิ่มเติมเมื่อเขียนลูกค้าของ API รวมถึงเอกสารช่วยเหลือ (GET / api / people vs. GET / api / person / 123? euuuchh.) .... แทนที่จะคิดว่ามันเหมือน "รับทรัพยากร # 123" วลีในหัวของคุณเช่น "ได้รับจากการรวบรวมทรัพยากรที่ ตรงกับ # 123 "
Warren Rumak

5
การจำแนกความแตกต่างของทรัพยากรพหูพจน์ / เอกพจน์ไม่ได้เกี่ยวกับความถูกต้องทางภาษา แต่เกี่ยวกับขนาด / พนักงาน / 12 อ่านถึงฉันในฐานะส่วนย่อยของทรัพยากรพนักงานที่มี id '12' (อาจมีความหมายอะไรก็ได้เช่นข้อความค้นหาที่บันทึกไว้ของพนักงานที่เพิ่งถูกไล่ออก) หากคุณอ่านข้างต้นในฐานะพนักงานที่มี id '12' คุณจะเป็นตัวแทนของกลุ่มย่อยอย่างไร ทางเลือกเดียวคือการทำให้การแยกแยะแร่ที่ซับซ้อนมากขึ้นของ URI ประกอบด้วยวัตถุจากวัตถุนั้น (เช่นเอกพจน์กับพหูพจน์)
Erik

9
การเลือก / พนักงาน / 12 เพื่อเป็นตัวแทนของคำค้นหาในพนักงานที่เพิ่งถูกไล่ออก (หรือชุดย่อยใด ๆ ) จะเป็นการออกแบบที่ไม่ดีฉันคิดว่า หากคุณต้องการที่จะเป็นตัวแทนของชุดย่อยใด ๆ กว่าที่ฉันแนะนำที่จะแนะนำพวกเขาเป็นทรัพยากร (ที่มีชื่อที่เหมาะสม) ในสิทธิของตนเอง
Jan Deinhard

3
สิ่งนี้ไม่เกี่ยวกับความเข้าใจของลูกค้า มันเกี่ยวกับการจัดการกับสิ่งต่าง ๆ ด้วย URL ที่ต่างกัน และสามารถตอบสนองต่อวิธี HTTP ทั้งหมดโดยไม่ขัดแย้งกัน คุณสามารถมีทรัพยากรที่เป็นชุดของรายการและทรัพยากรที่แสดงถึงตัวสินค้า สำหรับทั้งหมดที่ฉันดูแลทรัพยากรคอลเลกชันที่อาจจะexample.org/166316e2-e1andหนึ่งรายการโดยเฉพาะอย่างยิ่งในคอลเลกชันที่example.org/20d68348-ccc-001c4200de ลูกค้าไม่ควรสร้าง URL (เห็นได้ชัดว่าไม่ได้ปรับขนาดมันไม่สงบและนั่นคือประเภทของความสัมพันธ์ของลิงก์สำหรับ)
Erik

4
หากคุณไม่คิดว่า URL ที่น่าสนใจคุณสามารถระบุแหล่งรวบรวมด้วยชื่อพหูพจน์และรายการแต่ละรายการที่มีชื่อเอกพจน์ หากคุณไม่ชอบ URL ภาษาอังกฤษและภาษาธรรมชาติของคุณไม่สนับสนุนวิธีการแสดงสัญลักษณ์ / พหูพจน์ที่ใช้วิธีอื่นในการกำหนดในภาษาที่คุณต้องการฉันคิดว่าทุกภาษาช่วยให้คุณแยกความแตกต่าง '/ the-collection-of- bla / 2321 'กับ' bla / 61 'เป็นลายลักษณ์อักษร และทรัพยากรที่แตกต่างกันสองอย่างนั้นแสดงถึงผลลัพธ์ที่แตกต่างกันอย่างสิ้นเชิงเมื่อส่ง GET / PUT / DELETE / POST / PATCH และอื่น ๆ
Erik

77

พหูพจน์

  • ง่าย - URL ทั้งหมดเริ่มต้นด้วยคำนำหน้าเหมือนกัน
  • Logical - orders/รับรายการดัชนีคำสั่งซื้อ
  • มาตรฐาน - มาตรฐานที่ใช้กันอย่างแพร่หลายที่สุดตามด้วย API ของภาครัฐและเอกชนส่วนใหญ่

ตัวอย่างเช่น:

GET /resources - ส่งคืนรายการของรายการทรัพยากร

POST /resources - สร้างรายการทรัพยากรหนึ่งหรือหลายรายการ

PUT /resources - อัปเดตรายการทรัพยากรหนึ่งหรือหลายรายการ

PATCH /resources - อัปเดตรายการทรัพยากรหนึ่งหรือหลายรายการบางส่วน

DELETE /resources - ลบรายการทรัพยากรทั้งหมด

และสำหรับรายการทรัพยากรเดียว:

GET /resources/:id- ส่งคืนรายการทรัพยากรเฉพาะตาม:idพารามิเตอร์

POST /resources/:id - สร้างรายการทรัพยากรหนึ่งรายการพร้อมรหัสที่ระบุ (ต้องมีการตรวจสอบความถูกต้อง)

PUT /resources/:id - อัปเดตรายการทรัพยากรเฉพาะ

PATCH /resources/:id - อัปเดตรายการทรัพยากรเฉพาะบางส่วน

DELETE /resources/:id - ลบรายการทรัพยากรเฉพาะ

สำหรับผู้สนับสนุนเอกพจน์คิดแบบนี้: คุณจะขอคนorderและคาดหวังสิ่งหนึ่งหรือรายการสิ่งต่าง ๆ หรือไม่? ดังนั้นเหตุผลที่คุณจะคาดหวังการบริการที่จะกลับรายการของสิ่งที่เมื่อคุณพิมพ์/order?


10
เอกพจน์ : ในกรณีที่เมื่อส่วนหนึ่งของระบบของคุณเป็นวัตถุเดียว (0-1 มีอยู่หรือไม่) เช่นผู้ใช้ / 1 / avatar คุณสามารถใช้รูปแบบเอกพจน์สำหรับป้ายชื่อวัตถุเดียวนี้ (เช่น avatar) - ตัวอย่างรายละเอียดเพิ่มเติมที่นี่: stackoverflow .com BTW - คำตอบที่ดีมาก :)
Kamil Kiełczewski

แล้วการแม็พกับชื่อคลาสและชื่อตารางควรเป็นอะไร? (ดูคำตอบอื่น ๆ )
Will Sheppard

@WillSheppard - ชื่อคลาสดีที่สุดในรูปแบบเอกพจน์และชื่อตารางดีที่สุดในรูปแบบพหูพจน์ ตัวอย่างเช่นOrderเป็นชื่อที่ดีสำหรับคลาสที่เกี่ยวข้องกับอินสแตนซ์เอกพจน์ของวัตถุที่อ้างถึงคำสั่งเดียว OrderListเป็นชื่อสำหรับคลาสที่เกี่ยวข้องกับหลายOrderอินสแตนซ์ Orders Tableเป็นชื่อที่ดีสำหรับตารางฐานข้อมูลของคำสั่งซื้อจำนวนมาก
Eric Knudtson

ฉันต้องการรับ / คำสั่งซื้อ แต่ฉันต้องการเพียง / 1
jim smith

@ jim-smith แล้วทำไมคุณไม่ขอ / 1 จากการรวบรวมผู้ใช้ด้วย GET / users / 1
Rohmer

49

เอกพจน์

สิ่งอำนวยความสะดวกอาจมีชื่อพหูพจน์ที่ผิดปกติ บางครั้งพวกเขาก็ไม่มี แต่ชื่อเอกพจน์มักจะมี

เช่น CustomerAddress มากกว่า CustomerAddresses

พิจารณาทรัพยากรที่เกี่ยวข้องนี้

นี้สามารถอ่านได้มากขึ้นและตรรกะกว่า/order/12/orderdetail/12/orders/12/orderdetails/4

ตารางฐานข้อมูล

ทรัพยากรแสดงถึงเอนทิตีเช่นตารางฐานข้อมูล มันควรมีชื่อเอกพจน์เชิงตรรกะ นี่คือคำตอบของชื่อตาราง

การทำแผนที่ชั้น

ชั้นเรียนมีลักษณะเฉพาะตัวเสมอ เครื่องมือ ORM สร้างตารางที่มีชื่อเหมือนกับชื่อคลาส เมื่อมีการใช้เครื่องมือมากขึ้นเรื่อย ๆ ชื่อเอกพจน์กำลังกลายเป็นมาตรฐาน

อ่านเพิ่มเติมเกี่ยวกับDilemma ของผู้พัฒนา A REST API


39
ชื่อเอกพจน์นั้นอยู่ที่นั่นเสมอ /clothe/12/trouser/34 :)
Gert Arnold

18
@GertArnold คำclotheนี้เป็นคำกริยา API ส่วนที่เหลือมักติดกับคำนามเมื่อพูดถึงทรัพยากรและใช้คำกริยาเมื่ออธิบายการกระทำ รูปแบบที่เป็นเอกพจน์แต่โบราณและมีแนวโน้มที่จะถูกแทนที่มากขึ้นอย่างเหมาะสมโดยclout garment
Steve Buzonas

@SteveBuzonas และสำหรับกางเกงและแว่นกันแดด?
Koray Tugay

32

ในขณะที่การปฏิบัติที่แพร่หลายมากที่สุดคือ apis RESTful ที่มีการใช้คำพหูพจน์เช่น/api/resources/123มีกรณีพิเศษหนึ่งกรณีที่ฉันพบการใช้ชื่อเอกพจน์ที่เหมาะสม / แสดงออกมากกว่าชื่อพหูพจน์ มันเป็นกรณีของความสัมพันธ์แบบหนึ่งต่อหนึ่ง โดยเฉพาะถ้ารายการเป้าหมายเป็นวัตถุค่า (ในกระบวนทัศน์การออกแบบที่ขับเคลื่อนด้วยโดเมน)

ให้เราสมมติว่าทุกทรัพยากรมีaccessLogตัวต่อตัวซึ่งสามารถจำลองเป็นวัตถุที่มีค่าเช่นไม่ใช่เอนทิตีดังนั้นจึงไม่มี ID /api/resources/123/accessLogมันอาจจะแสดงเป็น คำกริยาปกติ (POST, PUT, DELETE, GET) จะแสดงเจตนาอย่างเหมาะสมและความจริงที่ว่าความสัมพันธ์นั้นเป็นแบบตัวต่อตัว


4
พยายามได้ดี. แต่มันจะดีกว่าในฐานะ "accessLogEntries" :-)
Tom Russell

8
@TomRussell ทำไม ความหมายของสิ่งนี้มีความสำคัญ ฉันเข้าใจว่าทำไมคุณถึงใช้พหูพจน์แม้ว่าคุณจะเข้าถึงทรัพยากรด้วยตัวระบุ แต่สำหรับหลายต่อหนึ่งหรือหนึ่งต่อหนึ่งมันค่อนข้างทำให้เข้าใจผิด พิจารณา API ที่จัดการพนักงานของ บริษัท หลายแห่ง พนักงานแต่ละคนทำงานที่เดียว GET /users/123/locationควรดึงข้อมูลตำแหน่งที่ผู้ใช้ทำงาน ไม่ใช่การGET /users/123/locationsหลอกลวงในฐานะผู้บริโภคใช่หรือไม่
Carrie Kendall

1
@CarrieKendall ฉันเห็นจุดของคุณ เนื่องจากaccessLogเป็นแบบจำลองเป็นคุณลักษณะหรือค่าแทนที่จะเป็นเอนทิตีมันควรจะเป็นเอกพจน์ /api/accessLogEntries?resource=123หากคุณได้รับไปกว่าวิศวกรรมแล้วรายการบันทึกจะเป็นนิติบุคคลและคุณจะต้อง
Tom Russell

เห็นด้วยแม้ว่าฉันคิดว่ามันจะทำลายการประชุมหลายฝ่ายทุกสิ่ง มันเป็นเรื่องยุ่งยาก สำหรับฉันมันเป็นสิ่งสำคัญกว่า API ที่เป็นเอกสารที่ตรงไปตรงมาเช่นควรจะชมเชยการใช้งานตรงไปตรงมาแล้ว
Carrie Kendall

ฉันเป็นโปรแกรมเมอร์มากกว่าระบบหรือบุคคลฐานข้อมูลดังนั้นฉันชอบ API ที่บอกเล่าเรื่องราวมากกว่าที่จะปฏิบัติตามแบบแผน ความหมายสำหรับเอกสารอัตโนมัติเป็นจริงแม้ว่า
Tom Russell

26

ทำไมไม่ทำตามแนวโน้มที่แพร่หลายของชื่อตารางฐานข้อมูลโดยทั่วไปจะยอมรับรูปแบบเอกฐาน? เคยมาที่นั่นทำอย่างนั้น - ลองใช้ใหม่อีกครั้ง

ตารางการตั้งชื่อ Dilemma: ชื่อเอกพจน์และพหูพจน์


8
Das Auto นั้นดีกว่า Die Autos นอกจากนี้อนุสัญญาพหูพจน์ภาษาอังกฤษก็ไม่สอดคล้องกัน
FlavourScape

7
เนมสเปซของทรัพยากรเป็นเรื่องของความหมายไม่ใช่การนำไปใช้ ดังนั้นการใช้ตาราง DB เปรียบเทียบก็ไม่ได้โชคดีมาก นอกจากนี้เมื่อทำงานกับ DB-s คุณกำลังจัดการกับตารางเท่านั้น แต่แน่นอนว่าคุณสามารถส่งผลกระทบต่อเนื้อหา (แถว) แต่ใน REST ไม่มีข้อ จำกัด ในการจัดการทรัพยากรเดียวโดยตรง
arpadf

3
ฉันคิดว่านี่เป็นการเปรียบเทียบที่ดี แต่สำคัญกว่าการตัดสินใจว่าจะเอกพจน์หรือพหูพจน์จะต้องสอดคล้องกับสิ่งที่คุณเลือก คุณจะไม่แทรกเข้าไปในผู้ใช้แล้วเลือกจากผู้ใช้ กฎเดียวกันควรใช้กับทรัพยากร REST - ห้ามเปลี่ยนชื่อขึ้นอยู่กับสิ่งที่คุณทำ
Todd Menier

3
มันไม่ได้เป็นเพียงชื่อตาราง แต่ยังเทียบได้กับชื่อคลาสใน OO (ชั้นของฉันจะเรียกว่าลูกค้าไม่ใช่ลูกค้า)
bytedev

ในกรณีนี้ความหมายมีความสำคัญมากเกินกว่าที่จะยอมรับแนวโน้ม "ที่ได้กำหนดไว้แล้ว" อย่างแน่นอน
Cattani Simone

19

ฉันประหลาดใจที่เห็นว่าผู้คนจำนวนมากจะกระโดดขึ้นไปบนคำนามพหูพจน์พหูพจน์ เมื่อใช้เอกพจน์กับการแปลงพหูพจน์คุณกำลังดูแลคำนามพหูพจน์ที่ผิดปกติหรือไม่? คุณชอบความเจ็บปวดไหม?

ดู http://web2.uvcs.uvic.ca/elc/studyzone/330/grammar/irrplu.htm

มีพหูพจน์ที่ผิดปกติหลายประเภท แต่สิ่งเหล่านี้พบได้บ่อยที่สุด:

คำนามประเภทการขึ้นรูปพหูพจน์ตัวอย่าง

Ends with -fe   Change f to v then Add -s   
    knife   knives 
    life   lives 
    wife   wives
Ends with -f    Change f to v then Add -es  
    half   halves 
    wolf   wolves
    loaf   loaves
Ends with -o    Add -es 
    potato   potatoes
    tomato   tomatoes
    volcano   volcanoes
Ends with -us   Change -us to -i    
    cactus   cacti
    nucleus   nuclei
    focus   foci
Ends with -is   Change -is to -es   
    analysis   analyses
    crisis   crises
    thesis   theses
Ends with -on   Change -on to -a    
    phenomenon   phenomena
    criterion   criteria
ALL KINDS   Change the vowel or Change the word or Add a different ending   
     man   men
     foot   feet
     child   children
     person   people
     tooth   teeth
     mouse   mice
 Unchanging Singular and plural are the same    
     sheep deer fish (sometimes)

5
ฉันไม่เข้าใจข้อกังวลที่นี่ เราไม่ควรเปลี่ยนเอกพจน์เป็นพหูพจน์โดยทางโปรแกรม รูปแบบพหูพจน์ข้างต้นส่วนใหญ่เป็นที่รู้จักกันดีและไม่ควรกังวล หากใครบางคนมีความรู้ภาษาอังกฤษไม่ดีเขาจะสะกดส่วนใดส่วนหนึ่งของตัวแปรของคุณไม่ถูกต้อง นอกจากนี้ตามตรรกะของคุณคุณยังแนะนำให้ใช้แบบฟอร์มเอกพจน์เพื่ออ้างอิงคอลเลกชันในซอร์สโค้ดด้วยหรือไม่
kishor borate

1
มีคำภาษาอังกฤษที่ผิดปกติไปจนถึงจุดที่มันมักจะมีปัญหาแม้ใน Anglosphere และพวกมันมักจะใช้คำศัพท์เช่นดัชนี / ดัชนี / ดัชนี, จุดยอด / จุดยอด / จุดยอด, เมทริกซ์ / เมทริกซ์ / เมทริกซ์, รัศมี / รัศมี / radii ฯลฯ ฉันไม่เห็นจุดในการสร้างเส้นทาง REST พหูพจน์ต่อไปเพราะถ้าพวกเขาเป็นเอกพจน์อย่างสม่ำเสมอมันก็ชัดเจนสำหรับทุกคน
damd

@kishorborate การใช้พหูพจน์เป็น URI นั้นมีแนวโน้มที่จะเกิดข้อผิดพลาดได้มากกว่าสำหรับผู้พูดภาษาอังกฤษ ดังที่ damd ระบุว่าพหูพจน์เช่นดัชนี / ดัชนี / ดัชนีกำลังแนะนำปัญหามากขึ้น และมีคำนามนับไม่ได้ การผสมคำนามที่นับไม่ได้เข้ากับพหูพจน์เป็นปัญหาอื่น ทำไมทำให้โปรแกรมเมอร์ยากที่จะใช้เวลากับสิ่งเหล่านี้มากขึ้น? ฉันขอแนะนำให้ใช้เอกพจน์สำหรับทุกสิ่ง หากมี / {id} API ควรส่งคืนระเบียนเดียว หากไม่มี / {id} ที่ตามมา API ควรส่งคืนการรวบรวม
Daming Fu

3
@DamingFu ทรัพยากรเอกพจน์อาจไม่ได้มี ID ที่เกี่ยวข้องเสมอไป เช่น. / user / {id} / nickName เมื่อดูแล้วจะไม่ชัดเจนว่าจะส่งคืนรายการชื่อเล่นหรือชื่อเล่นเดียวหรือไม่ ดังนั้น API จึงใช้งานง่ายขึ้นเมื่อใช้รูปแบบพหูพจน์ ใช่คำไม่กี่คำจะมีรูปแบบพหูพจน์ที่ผิดปกติ สำหรับคนที่กำลังอ่านรูปพหูพจน์ไม่ใช่ปัญหา เป็นปัญหาเฉพาะเมื่อเขียนลายเซ็น API แต่ความถี่ของคำดังกล่าวไม่สูงเช่นกันการค้นหารูปแบบพหูพจน์ของคำใด ๆ ก็ไม่ต้องใช้เวลานาน เราควรยอมรับเพื่อให้ API ใช้งานง่ายยิ่งขึ้น
kishor borate

15

จากมุมมองของผู้บริโภค API จุดสิ้นสุดควรคาดเดาได้

จะเป็นการดี ...

  1. GET /resources ควรส่งคืนรายการทรัพยากร
  2. GET /resource ควรส่งคืนรหัสสถานะ 400 ระดับ
  3. GET /resources/id/{resourceId} ควรส่งคืนคอลเล็กชันที่มีหนึ่งรีซอร์ส
  4. GET /resource/id/{resourceId} ควรส่งคืนวัตถุทรัพยากร
  5. POST /resources แบทช์ควรสร้างทรัพยากร
  6. POST /resource ควรสร้างทรัพยากร
  7. PUT /resource ควรปรับปรุงวัตถุทรัพยากร
  8. PATCH /resource ควรอัปเดตทรัพยากรโดยการโพสต์เฉพาะแอตทริบิวต์ที่เปลี่ยนแปลง
  9. PATCH /resources ควรอัพเดททรัพยากรที่โพสต์คุณลักษณะเฉพาะที่มีการเปลี่ยนแปลง
  10. DELETE /resourcesควรลบทรัพยากรทั้งหมด ล้อเล่น: รหัสสถานะ 400
  11. DELETE /resource/id/{resourceId}

วิธีนี้เป็นวิธีที่ยืดหยุ่นและมีคุณลักษณะหลากหลาย แต่ยังใช้เวลานานในการพัฒนา ดังนั้นหากคุณกำลังรีบ (ซึ่งมักเป็นกรณีที่มีการพัฒนาซอฟต์แวร์) เพียงแค่ตั้งชื่อปลายทางresourceหรือรูปแบบพหูพจน์ของคุณresourcesคุณ ฉันชอบรูปแบบเอกพจน์เพราะมันให้คุณเลือกที่จะใคร่ครวญและประเมินผลทางโปรแกรมเนื่องจากรูปแบบพหูพจน์ไม่ทั้งหมดลงท้ายด้วย 's'

ต้องบอกว่าสิ่งนั้นไม่ว่าด้วยเหตุผลใดก็ตามผู้พัฒนาแบบฝึกที่ใช้บ่อยที่สุดได้เลือกใช้รูปแบบพหูพจน์ นี่เป็นเส้นทางที่ฉันเลือกและถ้าคุณดู apis ที่เป็นที่นิยมgithubและtwitterนี่คือสิ่งที่พวกเขาทำ

เกณฑ์การตัดสินใจบางอย่างอาจเป็น:

  1. ข้อ จำกัด ด้านเวลาของฉันคืออะไร
  2. ฉันจะอนุญาตให้ผู้บริโภคทำอะไรได้บ้าง
  3. คำขอและน้ำหนักบรรทุกผลลัพธ์เป็นอย่างไร
  4. ฉันต้องการใช้การสะท้อนและแยกวิเคราะห์ URI ในรหัสของฉันหรือไม่

ดังนั้นมันขึ้นอยู่กับคุณ ทุกสิ่งที่คุณทำสอดคล้องกัน


1
ดูเหมือนว่าจะมีการเลือกรูปแบบพหูพจน์เนื่องจากผู้พัฒนาดูเหมือนว่าจะถือว่าทรัพยากรทั้งหมดเป็นส่วนหนึ่งของการรวบรวม อย่างไรก็ตาม "อนุสัญญาที่ยอมรับได้" ดูเหมือนจะระบุว่าPOST /usersควรสร้างผู้ใช้รายเดียวโดยเพิ่มลงในคอลเล็กชัน ฉันไม่เห็นด้วย. POST /usersควรสร้างรายชื่อผู้ใช้ (แม้ว่าจะเป็นรายชื่อ 1) ซึ่งPOST /userควรสร้างผู้ใช้เพียงรายเดียว ฉันไม่เห็นเหตุผลว่าทำไมจุดปลายทางทรัพยากรพหูพจน์และเอกพจน์ไม่สามารถอยู่ร่วมกันได้ พวกเขาอธิบายพฤติกรรมที่แตกต่างและไม่ควรแปลกใจกับการทำงานของพวกเขา
บดขยี้

ไม่มีแบบแผนสำหรับระบุรหัสทรัพยากรในเส้นทางหรือไม่ ถ้าเป็นเช่นนั้นดูเหมือนว่าจะถูกทอดทิ้งอย่างกว้างขวาง ตัวอย่างเช่นPOST users/<id>จะสร้างผู้ใช้ใหม่
Tom Russell

1
@TomRussell โดยปกติแล้วเซิร์ฟเวอร์จะสร้าง ID ดังนั้นคุณจะไม่ทราบ ID ที่ POST ถึง
อเล็กซ์

3
@TomRussell เมื่อลูกค้ากำหนด (ชนิดของ) ID เมื่อมีการสร้างทรัพยากรใหม่มันเป็นเรื่องธรรมดามากขึ้นเพื่อใช้แทนPUT /users/<id> มีการตีความ "เพิ่มสิ่งนี้ไปยังคอลเลกชันและกำหนด id เป็นส่วนหนึ่งของ" มีการตีความ "อัปเดต (หรือเพิ่ม) ทรัพยากรนี้ด้วยรหัสนี้" ดูrestcookbook.com/HTTP%20Methods/put-vs-postสำหรับคำอธิบายเพิ่มเติมเกี่ยวกับหลักการนี้ POSTPOSTPUT
Jochem Schulenklopper

ฉันไม่เชื่อว่าการเปรียบเทียบกับ Twitters API นั้นยุติธรรมเพราะพวกเขาใช้รูปแบบพหูพจน์สำหรับจุดสิ้นสุดทั้งหมดของพวกเขา พวกเขาไม่ได้ผสมพหูพจน์และเอกพจน์สำหรับองค์ประกอบเดียวกัน
Andrew T Finnell

7

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

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


2
รหัสนี้อยู่ที่พยายามที่จะ "ปลายทางอัตโนมัติสร้าง / mangle" (มีหลายไลบรารีที่มีความเห็นที่ถือว่าส่วนใหญ่ / เอกพจน์และพยายามที่จะแมป); อย่างไรก็ตามสิ่งนี้จะนำไปใช้กับชื่อปลายทางที่เลือกไว้อย่างชัดเจนมากกว่าการเลือกคำที่เหมาะสม
2864740

6

ฉันชอบใช้รูปแบบเอกพจน์ทั้งความเรียบง่ายและความมั่นคง

ตัวอย่างเช่นพิจารณา URL ต่อไปนี้:

/ ลูกค้า / 1

ฉันจะถือว่าลูกค้าเป็นลูกค้า แต่สำหรับความเรียบง่ายส่วนการรวบรวมจะถูกลบออก

ตัวอย่างอื่น:

/ อุปกรณ์ / 1

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


2
POST / ลูกค้าฟังดูเหมือนว่ามันจะแทนที่ลูกค้าเพียงรายเดียว นี่คือความเศร้าที่ใหญ่ที่สุดของฉันด้วยการใช้ชื่อทรัพยากรเอกพจน์
Andrew T Finnell

2
@ andrew-t-finnell คุณไม่POST /customerควรทำสิ่งนี้ - แทรกลูกค้ารายเดียวใช่ไหม
donmutti

มันแทรกลูกค้ารายเดียวลงในชุดของลูกค้า POST /customerอ่านถึงฉันราวกับว่ามันกำลังโพสต์ถึงtheลูกค้า ไม่ใช่ของสะสมของลูกค้า อย่างไรก็ตามฉันจะยอมรับว่าเป็นพหูพจน์หรือไม่เป็นพหูพจน์ ตราบใดที่พวกเขาไม่ได้ปะปนเหมือนคำตอบอื่น นั่นจะทำให้เกิดความสับสนอย่างไม่น่าเชื่อ
Andrew T Finnell

"โพสต์ต่อลูกค้า" ไม่สมเหตุสมผลในกรณีนี้ โพสต์ไม่ได้แทนที่มันแทรก บางทีถ้าเป็น POST / ลูกค้า / 1 ฉันสามารถเห็นภาวะที่กลืนไม่เข้าคายไม่ออก แต่ก็ไม่ได้ทำให้รู้สึกถึงมุมมอง REST มากนักเพราะคุณกำลังแทรกอะไรอยู่? มันจะเป็น / ลูกค้า / 1 / ใบแจ้งหนี้หรือ / ลูกค้า / 1 / ใบเสร็จ ฯลฯ
damd

5

ควรดู id ในเส้นทางเหมือนกับดัชนีไปยังรายการและการตั้งชื่อควรดำเนินการตามนั้น

numbers = [1, 2, 3]

numbers            GET /numbers
numbers[1]         GET /numbers/1
numbers.push(4)    POST /numbers
numbers[1] = 23    UPDATE /numbers/1

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

GET /dashboard
DELETE /session
POST /login
GET /users/{:id}/profile
UPDATE /users/{:id}/profile

4

ด้วยการตั้งชื่อแบบแผนมักจะปลอดภัยที่จะพูดว่า "เพียงแค่เลือกหนึ่งตัวและติดมัน" ซึ่งเหมาะสมแล้ว

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

และภายในบริบทนั้นกฎทางภาษาศาสตร์จะทำให้คุณได้รับสิ่งต่อไปนี้เท่านั้น:

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

และฉันชอบที่
ในทางกลับกัน - เป็นไดเรกทอรีของคุณคุณสามารถตั้งชื่อมันว่า "a-resource-or-multiple-resources" ถ้านั่นคือสิ่งที่คุณต้องการ นั่นไม่ใช่สิ่งสำคัญจริงๆ

สิ่งสำคัญคือถ้าคุณใส่ไฟล์ชื่อ "123" ภายใต้ไดเรกทอรีชื่อ "resourceS" (ส่งผลให้/resourceS/123) คุณจะไม่สามารถคาดหวังให้เข้าถึงไฟล์ผ่านทาง/resource/123คุณสามารถไม่ได้แล้วคาดว่าจะสามารถเข้าถึงได้ผ่าน

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

หมายเหตุ: ในทางเทคนิคคุณสามารถสร้าง "ลิงก์สัญลักษณ์" เพื่อให้/resources/123สามารถเข้าถึงได้ผ่านทาง/resource/123แต่ก่อนหน้านี้ยังคงมีอยู่!


3

มีลักษณะที่Google 's คู่มือการออกแบบ API: รายชื่อทรัพยากรสำหรับการใช้เวลาอีกต่อทรัพยากรการตั้งชื่อ

ในระยะสั้น:

  • คอลเลกชันถูกตั้งชื่อด้วยพหูพจน์
  • ทรัพยากรส่วนบุคคลมีชื่อด้วยสตริง
|--------------------------+---------------+-------------------+---------------+--------------|
| API Service Name         | Collection ID | Resource ID       | Collection ID | Resource ID  |
|--------------------------+---------------+-------------------+---------------+--------------|
| //mail.googleapis.com    | /users        | /name@example.com | /settings     | /customFrom  |
| //storage.googleapis.com | /buckets      | /bucket-id        | /objects      | /object-id   |
|--------------------------+---------------+-------------------+---------------+--------------|

มันเป็นการอ่านที่คุ้มค่าหากคุณกำลังคิดเกี่ยวกับเรื่องนี้


2

การใช้พหูพจน์สำหรับวิธีการทั้งหมดนั้นมีประโยชน์มากกว่าอย่างน้อยในด้านเดียว: หากคุณกำลังพัฒนาและทดสอบ API ทรัพยากรโดยใช้บุรุษไปรษณีย์ (หรือเครื่องมือที่คล้ายกัน) คุณไม่จำเป็นต้องแก้ไข URI เมื่อเปลี่ยนจาก GET เป็น PUT เป็น POST เป็นต้น .


1
ไม่ใช่ข้อโต้แย้งสำหรับฉันตั้งแต่บุรุษไปรษณีย์เสนอคอลเลกชันดังนั้นคุณสามารถบันทึกทรัพยากรทั้งหมดเป็นไอเท็มคอลเลกชันที่แตกต่างกันและทดสอบทีละรายการ สิ่งที่คุณทำคือการเลือกทรัพยากรจากการรวบรวมคุณไม่จำเป็นต้องแก้ไขพารามิเตอร์ / วิธี / ฯลฯ ทุกครั้ง
Wirone

1

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

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

หากคุณกำลังทำการเชื่อมโยงแบบลึก ๆ เพื่อเป็นตัวแทนของแบบสอบถามเกี่ยวกับความสัมพันธ์นักพัฒนาที่เขียนกับ API ของคุณอาจได้รับความช่วยเหลือโดยมีระเบียบที่เข้มงวดกว่า

อนุสัญญาของฉันคือว่าแต่ละระดับความลึกใน URI อธิบายการโต้ตอบกับทรัพยากรหลักและ URI เต็มควรอธิบายสิ่งที่ถูกดึงโดยปริยาย

สมมติว่าเรามีรูปแบบดังต่อไปนี้

interface User {
    <string>id;
    <Friend[]>friends;
    <Manager>user;
}

interface Friend {
    <string>id;
    <User>user;
    ...<<friendship specific props>>
}

หากฉันต้องการจัดหาทรัพยากรที่อนุญาตให้ไคลเอนต์ได้รับผู้จัดการของเพื่อนโดยเฉพาะของผู้ใช้บางคนมันอาจมีลักษณะดังนี้:

GET /users/{id}/friends/{friendId}/manager

ต่อไปนี้เป็นตัวอย่างเพิ่มเติม:

  • GET /users - แสดงรายการทรัพยากรผู้ใช้ในคอลเลกชันผู้ใช้ทั่วโลก
  • POST /users - สร้างผู้ใช้ใหม่ในคอลเลกชันผู้ใช้ทั่วโลก
  • GET /users/{id} - ดึงผู้ใช้เฉพาะจากการรวบรวมผู้ใช้ทั่วโลก
  • GET /users/{id}/manager - รับผู้จัดการของผู้ใช้ที่เฉพาะเจาะจง
  • GET /users/{id}/friends - รับรายชื่อเพื่อนของผู้ใช้
  • GET /users/{id}/friends/{friendId} - รับเพื่อนเฉพาะของผู้ใช้
  • LINK /users/{id}/friends - เพิ่มการเชื่อมโยงเพื่อนกับผู้ใช้รายนี้
  • UNLINK /users/{id}/friends - ลบการเชื่อมโยงเพื่อนจากผู้ใช้รายนี้

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


1

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

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

GET  /resources     =     GET  /resource
GET  /resources/1   =     GET  /resource/1
POST /resources/1   =     POST /resource/1
...

คุณได้รับรูปภาพ ไม่มีใครผิดใช้ความพยายามน้อยที่สุดและลูกค้าจะทำให้ถูกต้องเสมอ


1
หากคุณเปลี่ยนเส้นทาง 302 และแคชของคุณเก็บทุกอย่างสองครั้งแสดงว่าคุณตั้งค่าแคชผิด แคชไม่ควรจัดเก็บการเปลี่ยนเส้นทาง 302
wynnset

2
หากลูกค้าของคุณใช้/resourcesและมักจะถูกเปลี่ยนเส้นทางไป/resourceคุณจะทำผิด หากมีคนอื่นใช้ API ของคุณพวกเขาสามารถใช้ URL ที่ถูกต้องโดยตรงหรือเปลี่ยนเส้นทาง (ซึ่งใช้งานได้ แต่ผิด) และเป็นคุณที่เปิดวิธีที่ไม่ถูกต้อง
maaartinus

ไม่แน่ใจในสิ่งที่คุณหมายถึง "ผิด" - เป็นเรื่องส่วนตัวมาก มันไม่ผิดจริงๆเพราะมันใช้งานได้
wynnset

สิ่งนี้จะเพิ่มค่าบำรุงรักษาและค่าใช้จ่ายในการทำความเข้าใจและจำนวนรหัสที่ต้องการ
Sheppard จะ

1

ฉันไม่ชอบที่จะเห็น{id}ส่วนของ URL ที่ทับซ้อนกับทรัพยากรย่อยในฐานะidทางทฤษฎีอาจเป็นอะไรก็ได้และจะมีความกำกวม มันกำลังผสมแนวคิดที่แตกต่างกัน (ตัวระบุและชื่อทรัพยากรย่อย)

ปัญหาที่คล้ายกันมักจะเห็นในenumค่าคงที่หรือโฟลเดอร์โครงสร้างที่แนวคิดที่แตกต่างกันผสม (ตัวอย่างเช่นเมื่อคุณมีโฟลเดอร์Tigers, LionsและCheetahsแล้วยังโฟลเดอร์ที่เรียกว่าAnimalsอยู่ในระดับเดียวกัน - นี้ทำให้รู้สึกไม่เป็นหนึ่งเป็นส่วนหนึ่งของ อื่น ๆ )

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

ดังนั้นปลายทางที่จัดการกับผู้ใช้คนเดียว:

GET  /user             -> Not allowed, 400
GET  /user/{id}        -> Returns user with given id
POST /user             -> Creates a new user
PUT  /user/{id}        -> Updates user with given id
DELETE /user/{id}      -> Deletes user with given id

จากนั้นมีทรัพยากรแยกต่างหากสำหรับการทำแบบสอบถามกับผู้ใช้ซึ่งโดยทั่วไปแล้วจะส่งคืนรายการ:

GET /users             -> Lists all users, optionally filtered by way of parameters
GET /users/new?since=x -> Gets all users that are new since a specific time
GET /users/top?max=x   -> Gets top X active users

และนี่คือตัวอย่างของทรัพยากรย่อยที่เกี่ยวข้องกับผู้ใช้เฉพาะ:

GET /user/{id}/friends -> Returns a list of friends of given user

ทำความรู้จักกับเพื่อน (หลายต่อหลายลิงก์):

PUT /user/{id}/friend/{id}     -> Befriends two users
DELETE /user/{id}/friend/{id}  -> Unfriends two users
GET /user/{id}/friend/{id}     -> Gets status of friendship between two users

ไม่เคยมีความกำกวมใด ๆ และการตั้งชื่อพหูพจน์หรือเอกพจน์ของทรัพยากรเป็นคำแนะนำให้กับผู้ใช้สิ่งที่พวกเขาสามารถคาดหวัง (รายการหรือวัตถุ) ไม่มีข้อ จำกัด เกี่ยวกับids ตามหลักเหตุผลทำให้ผู้ใช้มี id newโดยไม่ทับซ้อนกับชื่อรีซอร์สย่อย (ในอนาคตที่เป็นไปได้)


1

ใช้เอกพจน์และใช้ประโยชน์จากการประชุมภาษาอังกฤษเช่น "Business Directory"

หลายสิ่งหลายอย่างอ่านด้วยวิธีนี้: "Book Case", "Dog Pack", "Art Gallery", "Film Festival", "Car Lot" ฯลฯ

สิ่งนี้สะดวกตรงกับเส้นทาง URL จากซ้ายไปขวา ประเภทรายการทางด้านซ้าย ตั้งค่าประเภททางด้านขวา

ไม่GET /usersจริงๆเคยดึงข้อมูลการตั้งค่าของผู้ใช้หรือไม่? ไม่ปกติ มันดึงชุดของสตับที่มีรหัสและชื่อผู้ใช้ ดังนั้นมันไม่ได้จริงๆ/usersล่ะค่ะ มันเป็นดัชนีของผู้ใช้หรือ "ดัชนีผู้ใช้" ถ้าคุณต้องการ ทำไมไม่เรียกมันว่า? /user/indexมันเป็น เนื่องจากเราตั้งชื่อชุดประเภทเราสามารถมีหลายประเภทที่แสดงการคาดการณ์ที่แตกต่างกันของผู้ใช้โดยไม่ต้องใช้พารามิเตอร์การสืบค้นเช่นuser/phone-listหรือ/user/mailing-listหรือ

แล้ว User 300 ล่ะ? /user/300ก็ยังคง

GET /user/index
GET /user/{id}

POST /user
PUT /user/{id}

DELETE /user/{id}

ในการปิด HTTP สามารถตอบกลับคำขอเดียวได้เพียงครั้งเดียวเท่านั้น เส้นทางมักจะอ้างถึงบางสิ่งบางอย่างที่เป็นเอกเทศ


-1

สำหรับฉันแล้วพหูพจน์จัดการคอลเลกชันในขณะที่เอกพจน์จัดการรายการภายในคอลเลกชันนั้น

คอลเล็กชันอนุญาตให้ใช้เมธอดGET / POST / DELETE

รายการอนุญาตวิธีการ GET / PUT / DELETE

ตัวอย่างเช่น

โพสต์เมื่อ/ นักเรียนจะเพิ่มนักเรียนใหม่ในโรงเรียน

ลบเมื่อ/ นักเรียนจะลบนักเรียนทั้งหมดในโรงเรียน

ลบใน/ นักเรียน / 123จะลบนักเรียน 123 ออกจากโรงเรียน

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

หากต้องการขยายตัวอย่างเพิ่มเติมถ้า API ควรเปิดเผยโรงเรียนหลายแห่ง

ลบบน/ โรงเรียน / abc / นักศึกษาabcจะลบนักเรียนทุกคนในโรงเรียน

การเลือกคำที่เหมาะสมบางครั้งก็เป็นสิ่งที่ท้าทายด้วยตัวเอง เช่นcart_itemsหรือcart/itemsรู้สึกถูก ในทางตรงกันข้ามการลบcartให้ลบวัตถุรถเข็นที่เป็นของตัวเองออกและไม่ใช่รายการที่อยู่ในรถเข็น;)


สิ่งนี้ไม่ควรถูกแบ่งเป็น / cart และ / cart / item จากนั้นคุณสามารถระบุที่อยู่ทั้งหมดในรถเข็น (เช่นด้วยการลบ) หรือรายการแต่ละรายการ?
Rob Grant

@RobertGrant นั่นจะเป็น "/ carts / items / 123" หรือไม่? (เช่นทำไม "รถเข็น" และไม่ใช่ "รถเข็น" คือกฎคือ 'พหูพจน์เสมอ')
2864740

1
ฉันยืนยันว่าหากรหัสการผลิตมีการตรวจสอบในที่สามารถทำการลบรายการในรถเข็นของทุกคนมีปัญหาที่ใหญ่กว่าการตั้งชื่อแบบแผน สิ่งที่น่าจะเป็นไปได้ที่พวกเขาจำได้ว่าไอดีเหนือรหัสนั้นน้อยกว่ามาก
Andrew T Finnell

ใครบ้างที่จะสร้างจุดปลายที่จะลบการสะสมทั้งหมด? ดูเหมือนว่าเป็นอันตรายอย่างยิ่งสำหรับฉันและอาจเป็นเพราะเหตุใด REST ไม่สนับสนุนการลบแบตช์จริงๆ (คุณต้องล้อมอาร์เรย์ไว้ในวัตถุ) ถ้าฉันต้องการจุดปลายเพื่อลบคอลเลกชันทั้งหมดฉันจะตรวจสอบให้แน่ใจว่า URI นั้นมีเอกลักษณ์มากและไม่เหมือนกับ POST
cnps

-1

เกี่ยวกับ:

/resource/(ไม่/resource)

/resource/ หมายความว่าเป็นโฟลเดอร์ที่มีสิ่งที่เรียกว่า "ทรัพยากร" มันเป็นโฟลเดอร์ "resouce"

และฉันก็คิดว่าหลักการตั้งชื่อของตารางฐานข้อมูลเหมือนกันตัวอย่างเช่นตารางที่เรียกว่า 'user' เป็น "ตารางผู้ใช้" มันมีสิ่งที่เรียกว่า "ผู้ใช้"


-2

ฉันชอบที่จะใช้ทั้งพหูพจน์ ( /resources) และเอกพจน์ ( /resource/{id}) เพราะฉันคิดว่ามันแยกตรรกะระหว่างการทำงานกับการรวบรวมทรัพยากรและการทำงานบนทรัพยากรเดียวได้ชัดเจนยิ่งขึ้น

ในฐานะที่เป็นผลข้างเคียงที่สำคัญของสิ่งนี้มันยังสามารถช่วยป้องกันคนที่ใช้ API อย่างไม่ถูกต้อง ตัวอย่างเช่นพิจารณากรณีที่ผู้ใช้พยายามรับทรัพยากรโดยระบุ Id เป็นพารามิเตอร์ดังนี้:

GET /resources?Id=123

ในกรณีนี้ที่เราใช้เวอร์ชันพหูพจน์เซิร์ฟเวอร์มักจะละเว้นพารามิเตอร์ Id และส่งคืนรายการทรัพยากรทั้งหมด หากผู้ใช้ไม่ระวังเขาจะคิดว่าการโทรนั้นสำเร็จและใช้ทรัพยากรแรกในรายการ

ในทางกลับกันเมื่อใช้รูปแบบเอกพจน์:

GET /resource?Id=123

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


1
ทำไมคุณผสมสำนวนที่นี่? คุณสามารถใช้สัญกรณ์ URI ที่เหมาะสมในวรรคแรกและจากนั้นสลับไปพารามิเตอร์การค้นหา? การใช้พารามิเตอร์การสืบค้นเพื่อรับทรัพยากรที่มี ID 123 เป็นฐานที่นี่ทั้งหมด
Andrew T Finnell

เห็นได้ชัดว่าเป็นความผิดพลาด ฉันได้อัพเดทคำตอบแล้ว ขอบคุณสำหรับการสังเกต
pberggreen

หลังจากถูกลดระดับลงอีกครั้งฉันดูสิ่งที่ฉันเขียนและฉันรู้ว่าโพสต์ต้นฉบับนั้นถูกต้อง ประเด็นของฉันคือถ้าผู้ใช้ทำสิ่งผิดปกติแล้วการใช้พหูพจน์ + เอกพจน์จะให้ข้อความแสดงข้อผิดพลาดที่ดีกว่าว่าใช้พหูพจน์เท่านั้น
pberggreen

ฉันยังรู้สึกว่านี่เป็นปัญหาที่ทำให้สับสน แนวคิดของการใช้พหูพจน์ก็คือมันเป็นของสะสม และจำนวนที่สิ้นสุดคือดัชนีลงในคอลเลกชัน ถ้าคุณได้รับทรัพยากรด้วยตัวเองล่ะ? การใช้ทั้งพหูพจน์และเอกพจน์ร่วมกันค่อนข้างสับสน การพูด / ทรัพยากร / 123 พูดว่า: รับทรัพยากรของฉัน 123 ในที่เก็บทรัพยากร
Andrew T Finnell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.