มีแนวทางการตั้งชื่อสำหรับ REST API หรือไม่ [ปิด]


212

เมื่อสร้าง REST API จะมีแนวทางหรือมาตรฐาน defacto สำหรับการตั้งชื่อการประชุมภายใน API (เช่น: ส่วนประกอบพา ธ ปลายทางของ URL, พารามิเตอร์การสอบถาม) อูฐแคปประจำหรือขีดล่างหรือไม่? คนอื่น ๆ ?

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

api.service.com/helloWorld/userId/x

หรือ

api.service.com/hello_world/user_id/x

หมายเหตุ: นี่ไม่ใช่คำถามของการออกแบบ RESTful API แต่เป็นแนวทางการตั้งชื่อเพื่อใช้สำหรับส่วนประกอบของพา ธ ในที่สุดและ / หรือพารามิเตอร์สตริงการสืบค้นที่ใช้

แนวทางใดจะได้รับการชื่นชม

คำตอบ:


150

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

ดังนั้น URL ของคุณควรมีลักษณะเช่นนี้ (ไม่สนใจปัญหาการออกแบบตามที่คุณร้องขอ :-))

api.service.com/hello-world/user-id/x

187
ตาม RFC2616 เฉพาะโครงร่างและโฮสต์บางส่วนของ URL ไม่คำนึงถึงขนาดตัวพิมพ์ ส่วนที่เหลือของ URL คือพา ธ และแบบสอบถามควรเป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3
Darrel Miller

10
แดเนียลคุณพูดถูกต้องขอบคุณที่ชี้ให้เห็น อย่างไรก็ตามโดยทั่วไปเราคาดหวังว่า URL จะไม่สนใจกรณีและปัญหาโดยเฉพาะส่วนชื่อทรัพยากร มันจะไม่มีเหตุผลที่ userid & UserId จะทำงานแตกต่างกัน (เว้นแต่ว่าหนึ่งในนั้นจะส่งคืน 404)
LiorH

18
@LiorH: ทำไมคุณถึงคิดว่า "ไม่มีเหตุผล" เป็นกรณี ๆ ไป? บริบทอื่น ๆ อีกมากเป็นกรณีที่อ่อนไหวต่อผลดี มีบางบริการเว็บ (เช่น Amazon S3) ที่มีการทำบังคับใช้ความไวกรณีปลายทาง URL และผมคิดว่ามันค่อนข้างเหมาะสม
แฮงค์

6
@Dennis ของ Windows ระบบไฟล์เซิร์ฟเวอร์เป็นกรณีตายตามค่าเริ่มต้นเว้นแต่ฉันเข้าใจผิดอย่างมากtechnet.microsoft.com/en-us/library/cc725747.aspx
samspot

5
@samspot Good one! ฉันคิดว่า windows เปลี่ยนชื่อไฟล์เป็นกรณี ๆ ไปเมื่อสร้างเซิร์ฟเวอร์ ว้าวพวกเขายังคงผลักดันเส้นทางของพวกเขาให้นานที่สุดเท่าที่จะทำได้เช่น "1 MicroSoft Way" ;-)
Dennis

87

REST API สำหรับDropbox , Twitter , Google Web ServicesและFacebookทั้งหมดใช้ขีดล่าง


24
หนึ่งในผลข้างเคียงของการทำเช่นนั้นก็คือ 'คำว่า' ที่ขีดเส้นใต้ไว้จะถูกเก็บรวมไว้ในดัชนีการค้นหาของ Google คนที่ถูกไฮฮีทจะถูกแบ่งออกเป็นคำที่แยกจากกัน
Dennis

ตัวอย่าง: dev.twitter.com/docs/api/1.1
mike kozelsky

11
แม้ว่า Google Maps API จะใช้ขีดเส้นใต้ แต่Google Style Guide นั้นจำเป็นต้องใช้ Camel Case Google+ APIและค้นหาที่กำหนดเอง APIหมู่คนใช้อูฐกรณี
Benjamin

2
พวกเขายังคงใช้ '-' เป็นตัวคั่น URL เหล่านั้น: P developers.google.com/custom-search/json-api/v1/reference/cse/… developers.google.com/+/best-practices dev.twitter com / ภาพรวม / กรณีศึกษา ในทางกลับกันพวกเขาใช้ camelCase ในพารามิเตอร์การสืบค้น
Mattias

1
ไม่มีใครรู้ ...
Piotr Kula

84

ดู URI อย่างละเอียดเพื่อหาแหล่งข้อมูลบนเว็บแบบธรรมดา นั่นคือแม่แบบของคุณ คิดว่าต้นไม้ไดเรกทอรี ใช้ชื่อไฟล์และไดเรกทอรีแบบ Linux อย่างง่าย

HelloWorldไม่ใช่แหล่งข้อมูลที่ดีจริงๆ ดูเหมือนจะไม่เป็น "สิ่ง" มันอาจจะเป็น แต่มันก็ไม่เหมือนคำนามมาก A greetingคือสิ่งหนึ่ง

user-idอาจเป็นคำนามที่คุณกำลังเรียก อย่างไรก็ตามเป็นที่น่าสงสัยว่าผลลัพธ์ของคำขอของคุณเป็นเพียง user_id มีโอกาสมากที่ผลลัพธ์ของคำขอจะเป็นผู้ใช้ ดังนั้นuserเป็นคำนามที่คุณกำลังเรียก

www.example.com/greeting/user/x/

ทำให้รู้สึกถึงฉัน มุ่งเน้นไปที่การขอให้ส่วนที่เหลือของคุณขอวลีคำนาม - เส้นทางผ่านลำดับชั้น (หรืออนุกรมวิธานหรือไดเรกทอรี) ใช้คำนามที่ง่ายที่สุดที่เป็นไปได้หลีกเลี่ยงวลีคำนามถ้าเป็นไปได้

โดยทั่วไปวลีคำนามประสมมักจะหมายถึงขั้นตอนอื่นในลำดับชั้นของคุณ ดังนั้นคุณจึงไม่ต้องและ/hello-world/user/ /hello-universe/user/คุณมีและ/hello/world/user/ hello/universe/user/หรืออาจจะเป็นและ/world/hello/user//universe/hello/user/

ประเด็นคือเพื่อให้เส้นทางการนำทางในหมู่ทรัพยากร


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

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

30

'รหัสผู้ใช้' เป็นวิธีที่ผิดทั้งหมด คำกริยา (HTTP วิธีการ) และวิธีการของคำนามคือสิ่งที่รอยฟีลดิงหมายสำหรับสถาปัตยกรรม REST คำนามมีดังนี้:

  1. เก็บของสิ่งที่
  2. สิ่ง

แบบแผนการตั้งชื่อที่ดีอย่างหนึ่งคือ:

[POST or Create](To the *collection*)
sub.domain.tld/class_name.{media_type} 

[GET or Read](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[PUT or Update](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[DELETE](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[GET or Search](of a *collection*, FRIENDLY URL)
sub.domain.tld/class_name.{media_type}/{var}/{value}/{more-var-value-pairs}

[GET or Search](of a *collection*, Normal URL)
sub.domain.tld/class_name.{media_type}?var=value&more-var-value-pairs

โดยที่ {media_type} เป็นหนึ่งใน: json, xml, rss, pdf, png, แม้แต่ html

เป็นไปได้ที่จะแยกแยะคอลเลกชันโดยเพิ่ม 's' ที่ส่วนท้ายเช่น:

'users.json' *collection of things*
'user/id_value.json' *single thing*

แต่นั่นหมายความว่าคุณต้องติดตามตำแหน่งที่คุณวางไว้และที่ที่คุณไม่ได้อยู่ อีกครึ่งหนึ่งของโลก (ชาวเอเชียสำหรับผู้เริ่มต้น) พูดภาษาโดยไม่มีคำพหูพจน์ชัดเจนดังนั้น URL จึงไม่เป็นมิตรกับพวกเขา


มีความหมายอะไรกับ {var} หากฉันค้นหาผู้ใช้ด้วยชื่อที่จะเป็นตัวอย่าง ... / user / username / tomsawyer?
Hans-Peter Störr

1
หากคุณมีตัวแปรสามตัว (var) ชื่อ x, y, z คุณก็จะมี URL ดังนี้: sub.domain.tld / x / value_of_x / y / value_of_y / z / value_of_z
Dennis

@hstoerr เพียงเพื่อให้แน่ใจว่าฉันชัดเจนภาษาสคริปต์ส่วนใหญ่ใช้ 'การแทนที่ตัวแปรวงเล็บปีกกา' ดังนั้น {var} หมายถึงว่าตัวแปรบางตัว (ชื่อของมัน) นั้นอยู่ที่นั่นดังนั้น {value} ต่อไปนี้จึงเป็นที่ที่ค่าของ {var} อยู่ข้างหน้า ตัวอย่าง: sub.domain.tld / script / {var} / {value} .json [www.yelp.com/food_reviews/review_averages_higher_than/4.json] จะพยายามให้ได้ผลลัพธ์ json จาก yelp.com เพื่อแสดงข้อมูลเกี่ยวกับอาหาร ค่าสูงกว่า 4
Dennis

นี่คือคำตอบที่ดีที่สุดในความคิดและความรุ่งโรจน์ของการคิดในระดับสากล
beiller

14

ไม่ REST ไม่มีส่วนเกี่ยวข้องกับการตั้งชื่อ URI หากคุณรวมอนุสัญญาเหล่านี้ไว้เป็นส่วนหนึ่งของ API ของคุณนอกกรอบแทนที่จะผ่านไฮเปอร์เท็กซ์เท่านั้น API ของคุณจะไม่สงบ

สำหรับข้อมูลเพิ่มเติมดูที่http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven


44
ให้มันพัก ... มันยังดีที่มี URL ที่ดูดี
HDave

1
เห็นด้วยกับ @HDave เป็นอย่างมากในจิตวิญญาณของ REST ที่จะมี URL ที่เข้าใจได้ง่าย คุณทำงานกับ URL ทำไมคุณไม่ต้องการให้พวกเขาเข้าใจได้ง่ายเหมือนกับชื่อตัวแปรและพารามิเตอร์ในรหัสของคุณ
mahemoff

4
@mahemoff ขออภัยนี่คือฉันเป็นซุปเปอร์อวดความรู้ แต่สิ่งที่ URL ของคุณดูเหมือนไม่มีส่วนเกี่ยวข้องกับ REST นั่นไม่ได้หมายความว่าพวกเขาไม่ใช่สิ่งที่ดีที่จะมีพวกเขาเป็นเพียงมุมฉากกับสิ่งที่ REST อธิบาย เป็นเรื่องที่เข้าใจผิดที่จะกล่าวว่า REST นั้นเกี่ยวกับการสร้าง URL ด้วยวิธีนี้เนื่องจากมันจะนำไปสู่คนที่อธิบาย RPC APIs เป็น REST เพียงเพราะพวกเขามี URL ที่อ่านได้ / มีโครงสร้าง
aehlke

5
โดยสรุปแล้ว URL ที่ดูดีนั้นเยี่ยมยอดและทุกคนควรมี มันไม่เกี่ยวอะไรกับ REST
aehlke

1
@aehlke ขอบคุณสำหรับการล้างข้อมูลนี้ ส่วนที่เหลือไม่ได้เกี่ยวกับโครงสร้าง URL ฉันไม่เข้าใจว่าทำไมมันจึงยากสำหรับคนที่จะเข้าใจ
user1431072

9

ชื่อโดเมนไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก แต่ส่วนที่เหลือของ URI สามารถเป็นได้ มันเป็นความผิดพลาดครั้งใหญ่ที่สมมติว่า URIs นั้นไม่ได้ตรงตามตัวพิมพ์ใหญ่ - เล็ก


6

ฉันมีรายการแนวทางที่http://soaprobe.blogspot.co.uk/2012/10/soa-rest-service-naming-guideline.htmlซึ่งเราได้ใช้ในการผลิต แนวทางเป็นที่ถกเถียงกันอยู่เสมอ ... ฉันคิดว่าบางครั้งความมั่นคงมีความสำคัญมากกว่าการทำให้สมบูรณ์แบบ (หากมีสิ่งนั้น)


2

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

api.service.com/helloWorld/userId/x

ค่อนข้างจะทำให้ userId เป็นพารามิเตอร์การสืบค้น (ซึ่งเป็นสิ่งที่ถูกกฎหมายอย่างสมบูรณ์) ตัวอย่างของฉันแสดงถึงทรัพยากรใน IMO ซึ่งเป็นวิธีที่สงบมากขึ้น


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

เนื่องจากใน REST URL ของคุณเป็นอินเทอร์เฟซของคุณดังนั้นจึงเป็นคำถามประเภท API ในขณะที่ฉันไม่คิดว่ามีแนวทางที่เฉพาะเจาะจงกับตัวอย่างของคุณฉันจะไปกับกรณีอูฐส่วนตัว
Gandalf

คุณไม่ควรใช้พารามิเตอร์การสืบค้นสำหรับแหล่งข้อมูลที่คุณต้องการแคชในระดับ HTTP กองซ้อน
aehlke

@aehlke ตรงกันข้ามแน่นอนถือเป็นจริงเช่นกัน หากคุณไม่ต้องการแคชพารามิเตอร์การสืบค้นให้ใช้สไตล์ GET สำหรับพารามิเตอร์ ~ หรือ ~ สร้าง DARN SURE เพื่อแก้ไข / แทรกส่วนหัวต่อต้านการแคชสำหรับสิ่งที่คุณไม่ต้องการแคช นอกจากนี้ยังมีส่วนหัวที่เป็นแฮชของการเรียกคืนออบเจ็กต์ / หน้าให้ใช้เพื่อระบุการเปลี่ยนแปลงของสิ่งที่คุณต้องการแคช แต่อัปเดตเมื่อมีการแก้ไข
Dennis

@aehlke พบกับแคชแล้วและกำลังเพิ่มอยู่ ฉันจำงานนำเสนอ CodeCamp ที่หนึ่งใน speedups ทำส่วนหัวทั้งหมดเหล่านี้แล้วเปลี่ยนชื่อไฟล์และการอ้างอิงทั้งหมดเมื่อมีการเปลี่ยนแปลงเนื้อหาเพื่อรับ borwsers และพร็อกซี่ไปยังเซิร์ฟเวอร์รุ่นใหม่หลังจากเวลาแคชนาน ชุด นี่คือรายละเอียดเต็มไปด้วยเลือดทั้งหมด: developers.google.com/speed/docs/best-practices/caching
Dennis

2

หากคุณรับรองความถูกต้องของลูกค้าด้วย Oauth2 ฉันคิดว่าคุณจะต้องขีดเส้นใต้อย่างน้อยสองชื่อพารามิเตอร์ของคุณ:

  • client_id
  • client_secret

ฉันใช้ camelCase ใน REST API ของฉัน (ยังไม่เผยแพร่) ในขณะที่เขียนเอกสาร API ฉันคิดว่าจะเปลี่ยนทุกอย่างเป็น snake_case ดังนั้นฉันไม่ต้องอธิบายว่าทำไม Oauth params เป็น snake_case ในขณะที่ params อื่น ๆ ไม่ใช่

ดู: https://tools.ietf.org/html/rfc6749


0

ฉันจะบอกว่ามันจะดีกว่าที่จะใช้อักขระพิเศษน้อยที่สุดใน REST URL ข้อดีอย่างหนึ่งของ REST คือทำให้ "ส่วนต่อประสาน" สำหรับบริการอ่านง่าย กรณี Camel หรือ Pascal case น่าจะดีสำหรับชื่อทรัพยากร (ผู้ใช้หรือผู้ใช้) ฉันไม่คิดว่าจะมีมาตรฐานที่ยากใด ๆ รอบ ๆ REST

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

http://api.example.com/HelloWorld/Users/12345/Order/3/etc

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