Apakah ada pedoman konvensi penamaan untuk REST API? [Tutup]

212

Saat membuat REST API, apakah ada pedoman atau standar defacto untuk penamaan konvensi dalam API (mis .: komponen jalur titik akhir URL, parameter kueri)? Apakah topi unta adalah norma, atau garis bawah? orang lain?

Sebagai contoh:

api.service.com/helloWorld/userId/x

atau

api.service.com/hello_world/user_id/x

Catatan: Ini bukan pertanyaan tentang RESTful API design, melainkan panduan konvensi penamaan yang akan digunakan untuk komponen lintasan akhirnya dan / atau parameter string kueri yang digunakan.

Pedoman apa pun akan dihargai.

Joror
sumber

Jawaban:

150

Saya pikir Anda harus menghindari topi unta. Normalnya adalah menggunakan huruf kecil. Saya juga akan menghindari garis bawah dan menggunakan tanda hubung sebagai gantinya

Jadi URL Anda akan terlihat seperti ini (mengabaikan masalah desain seperti yang Anda minta :-))

api.service.com/hello-world/user-id/x
LiorH
sumber
187
Menurut RFC2616 hanya skema dan bagian host dari URL tidak peka huruf besar-kecil. URL lainnya, yaitu jalur dan kueri HARUS peka huruf besar-kecil. w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3
Darrel Miller
10
Daniel, kau benar, terima kasih sudah menunjukkannya. Namun, secara de facto kami biasanya berharap url mengabaikan kasus, terutama bagian nama sumber daya. Tidak masuk akal bagi userid & UserId untuk berperilaku berbeda (kecuali salah satu dari mereka mengembalikan 404)
LiorH
18
@LiorH: Mengapa Anda pikir "tidak masuk akal" untuk menjadi case-sensitive? Banyak konteks lain yang peka terhadap huruf besar / kecil. Ada beberapa layanan web (misalnya Amazon S3) yang melakukan sensitivitas huruf besar-kecil untuk titik akhir URL, dan saya pikir itu cukup tepat.
Hank
6
@Dennis Windows filesystem Server adalah case sensitif secara default, kecuali aku sangat keliru technet.microsoft.com/en-us/library/cc725747.aspx
samspot
5
@spotpot Bagus! Saya berpikir bahwa windows langsung menggunakan nama file sensitif ketika mereka membuat server. WOW, mereka masih mendorong jalan MEREKA selama mungkin, yaitu "1 MicroSoft Way". ;-)
Dennis
87

API REST untuk Dropbox , Twitter , Layanan Web Google , dan Facebook semuanya menggunakan garis bawah.

jz1108
sumber
24
Salah satu efek samping dari itu adalah bahwa 'kata-kata' yang digarisbawahi tetap utuh, bersama-sama dalam indeks pencarian google. Kata-kata terpecah dibagi menjadi kata-kata yang terpisah.
Dennis
Contoh: dev.twitter.com/docs/api/1.1
mike kozelsky
11
Meskipun Google Maps API memang menggunakan garis bawah, Panduan Gaya Google membutuhkan Kasing Unta. The Google+ API dan Custom Search API , antara lain, menggunakan Camel Case.
Benjamin
2
Namun mereka masih menggunakan '-' sebagai pemisah url tersebut: P developers.google.com/custom-search/json-api/v1/reference/cse/… developers.google.com/+/best-practices dev.twitter. com / tinjauan umum / studi kasus Di sisi lain mereka menggunakan camelCase dalam parameter kueri.
Mattias
1
Tidak ada yang tahu ...
Piotr Kula
84

Perhatikan baik-baik sumber daya web biasa di URI. Itu adalah templat Anda. Pikirkan pohon direktori; menggunakan nama file dan direktori seperti Linux yang sederhana.

HelloWorldbukan kelas sumber daya yang benar-benar bagus. Tampaknya tidak menjadi "benda". Mungkin, tapi itu tidak seperti kata benda. A greetingadalah suatu hal.

user-idmungkin kata benda yang Anda ambil. Namun, diragukan bahwa hasil permintaan Anda hanya user_id. Ini jauh lebih mungkin bahwa hasil dari permintaan adalah Pengguna. Karenanya, useradalah kata benda yang Anda ambil

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

Masuk akal bagi saya. Berfokuslah untuk membuat REST Anda meminta semacam frase kata benda - jalur melalui hierarki (atau taksonomi, atau direktori). Gunakan kata benda sesederhana mungkin, hindari frasa kata benda jika memungkinkan.

Secara umum, frase nomina majemuk biasanya berarti langkah lain dalam hierarki Anda. Jadi kamu tidak punya /hello-world/user/dan /hello-universe/user/. Anda punya /hello/world/user/dan hello/universe/user/. Atau mungkin /world/hello/user/dan /universe/hello/user/.

Intinya adalah untuk menyediakan jalur navigasi di antara sumber daya.

S.Lott
sumber
4
Pertanyaan saya lebih banyak tentang konvensi penamaan dari nama path akhirnya dan / atau parameter querystring apa pun itu. Saya setuju dengan Anda merancang rekomendasi, jadi terima kasih, tetapi dengan pertanyaan ini saya hanya bertanya tentang konvensi penamaan.
jnorris
1
Sebagai catatan, tidak ada yang menghentikan Anda menggunakan REST untuk sumber daya non-hierarkis. Konvensi penamaan URI yang sebenarnya Anda gunakan tidak penting, cukup gunakan apa pun yang menurut Anda bagus dan mudah untuk diurai di server. Klien seharusnya tidak tahu apa-apa tentang menghasilkan URI karena Anda perlu mengirim URI ke sumber daya melalui hypertext dalam respons Anda.
aehlke
30

'UserID' sepenuhnya merupakan pendekatan yang salah. Pendekatan Verb (Metode HTTP) dan Noun adalah yang dimaksud Roy Fielding untuk arsitektur REST . Kata benda adalah:

  1. Sebuah Koleksi dari hal-hal
  2. Suatu hal

Satu konvensi penamaan yang baik adalah:

[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

Di mana {media_type} adalah salah satu dari: json, xml, rss, pdf, png, bahkan html.

Dimungkinkan untuk membedakan koleksi dengan menambahkan 's' di bagian akhir, seperti:

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

Tetapi ini berarti Anda harus melacak di mana Anda telah menempatkan 's' dan di mana Anda belum. Plus setengah dari planet ini (orang Asia untuk pemula) berbicara bahasa tanpa bentuk jamak eksplisit sehingga URL kurang ramah bagi mereka.

Dennis
sumber
Apa yang dimaksud dengan {var}? Jika saya mencari pengguna dengan nama yang akan misalnya ... / user / nama pengguna / tomsawyer?
Hans-Peter Störr
1
Jika Anda memiliki tiga variabel (var) bernama x, y, z, maka URL Anda akan terlihat seperti: sub.domain.tld / x / value_of_x / y / value_of_y / z / value_of_z
Dennis
@ hstoerr Hanya untuk memastikan saya jelas, sebagian besar bahasa skrip menggunakan semacam 'substitusi variabel kurung kurawal'. Jadi {var} menandakan bahwa beberapa variabel (namanya) berada di sana, dan {value} berikut adalah tempat nilai {var} sebelumnya. Contoh: sub.domain.tld / script / {var} / {value} .json [www.yelp.com/food_reviews/review_averages_higher_than/4.json] akan mencoba mendapatkan hasil json dari yelp.com untuk makanan yang ditampilkan di restoran nilai lebih tinggi dari 4.
Dennis
Ini adalah jawaban terbaik menurut pendapat saya dan pujian untuk berpikir secara internasional.
beiller
14

Tidak. REST tidak ada hubungannya dengan konvensi penamaan URI. Jika Anda memasukkan konvensi ini sebagai bagian dari API Anda, out-of-band, bukan hanya melalui hypertext, maka API Anda tidak TENANG.

Untuk informasi lebih lanjut, lihat http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

aehlke
sumber
44
Istirahat dulu ... tetap menyenangkan memiliki URL yang terlihat bagus.
HDave
1
Setuju dengan @HDave, sangat semangat REST untuk memiliki URL yang mudah dipahami. Anda bekerja dengan URL, mengapa Anda tidak ingin URL itu semudah dipahami sebagai nama variabel dan parameter dalam kode Anda?
mahemoff
4
@mahemoff maaf, ini aku menjadi super pedantic. Tapi seperti apa URL Anda tidak ada hubungannya dengan REST. Itu tidak berarti bahwa mereka bukan hal yang baik untuk dimiliki, mereka hanya ortogonal dengan apa yang dijelaskan REST. Menyesatkan untuk mengatakan bahwa REST adalah tentang penataan URL dengan cara ini, karena REST mengarah ke orang yang menggambarkan API RPC sebagai REST hanya karena mereka memiliki URL yang dapat dibaca / terstruktur.
aehlke
5
Singkatnya, URL yang terlihat bagus sangat bagus dan semua orang harus memilikinya. Itu tidak ada hubungannya dengan REST.
aehlke
1
@ aehlke terima kasih sudah membereskannya. Rest bukan tentang struktur URL. Saya tidak mengerti mengapa sulit bagi orang untuk mengerti.
user1431072
9

Nama domain tidak peka terhadap huruf besar tetapi sisa URI tentu saja bisa. Adalah kesalahan besar untuk menganggap URI tidak peka terhadap huruf besar-kecil.


sumber
2

Saya tidak berpikir kasus unta adalah masalah dalam contoh itu, tetapi saya membayangkan konvensi penamaan yang lebih tenang untuk contoh di atas adalah:

api.service.com/helloWorld/userId/x

alih-alih membuat userId parameter kueri (yang benar-benar legal) contoh saya menunjukkan sumber daya itu, IMO, cara yang lebih tenang.

Gandalf
sumber
Ini bukan pertanyaan tentang RESTful API design, melainkan panduan konvensi penamaan yang akan digunakan untuk komponen lintasan akhirnya dan / atau parameter string kueri yang digunakan. Dalam contoh Anda, haruskah komponen jalur berada di topi unta seperti yang Anda gunakan, atau menggarisbawahi?
jnorris
Ya karena di REST URL Anda adalah antarmuka Anda, maka itu semacam pertanyaan API. Meskipun saya tidak berpikir ada pedoman khusus untuk contoh Anda, saya akan pergi dengan case unta secara pribadi.
Gandalf
Anda tidak boleh menggunakan parameter kueri untuk sumber daya yang ingin di-cache di setiap tingkat tumpukan HTTP.
aehlke
@ aehlke, kebalikannya juga berlaku. Jika Anda TIDAK ingin cache parameter di-cache, gunakan gaya GET untuk parameter, ~ ATAU ~ buat DARN SURE untuk memodifikasi / menyisipkan header anti-cache untuk apa pun yang Anda tidak ingin di-cache. Juga, thre adalah beberapa tajuk yang merupakan hash dari objek / halaman returend, gunakan itu untuk menunjukkan perubahan hal-hal yang Anda inginkan di-cache, tetapi diperbarui ketika ada pengeditan.
Dennis
@ aehlke Mengetahui tentang caching dan saya menambahkannya. Saya ingat presentasi CodeCamp di mana salah satu speedup melakukan semua header ini, dan kemudian mengubah nama file dan semua referensi untuk itu ketika isinya diubah untuk mendapatkan borwser dan proksi ke server versi yang lebih baru setelah waktu cache yang lama telah set. Berikut ini semua detail berdarah: developers.google.com/speed/docs/best-practices/caching
Dennis
2

Jika Anda mengautentikasi klien Anda dengan Oauth2 saya pikir Anda akan perlu menggarisbawahi untuk setidaknya dua nama parameter Anda:

  • client_id
  • client_secret

Saya telah menggunakan camelCase di API SISA saya (belum diterbitkan). Saat menulis dokumentasi API saya telah berpikir untuk mengubah segalanya menjadi snake_case jadi saya tidak perlu menjelaskan mengapa param Oauth adalah snake_case sedangkan param lainnya tidak.

Lihat: https://tools.ietf.org/html/rfc6749

Michael
sumber
0

Saya akan mengatakan bahwa lebih baik menggunakan karakter khusus sesedikit mungkin dalam URL REST. Salah satu manfaat REST adalah membuat "antarmuka" untuk layanan mudah dibaca. Casing unta atau Cascal case mungkin baik untuk nama sumber daya (Pengguna atau pengguna). Saya tidak berpikir ada standar keras di sekitar REST.

Juga, saya pikir Gandalf benar, biasanya lebih bersih di REST untuk tidak menggunakan parameter string kueri, tetapi malah membuat jalur yang menentukan sumber daya mana yang ingin Anda tangani.

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

Andy White
sumber