แบบแผน 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.