REST API'leri için adlandırma kuralı yönergeleri var mı? [kapalı]


212

REST API'leri oluştururken, API içindeki kuralları adlandırmak için herhangi bir yönerge veya kusurlu standartlar var mı (ör. URL bitiş noktası yolu bileşenleri, sorgu dizesi parametreleri)? Deve kapakları norm mu yoksa alt çizgi mi? diğerleri?

Örneğin:

api.service.com/helloWorld/userId/x

veya

api.service.com/hello_world/user_id/x

Not: Bu RESTful API tasarımıyla ilgili bir sorun değil, kullanılan yol bileşenleri ve / veya kullanılan sorgu dizesi parametreleri için kullanılacak adlandırma kuralları kılavuzudur.

Herhangi bir yönerge takdir edilecektir.

Yanıtlar:


150

Bence deve kapaklarından kaçınmalısınız. Norm, küçük harfler kullanmaktır. Ayrıca alt çizgilerden kaçınır ve bunun yerine tire kullanırım

URL'niz şöyle görünmelidir (istediğiniz gibi tasarım sorunlarını görmezden gelir :-))

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

187
RFC2616'ya göre, URL'nin yalnızca şeması ve ana bilgisayar bölümleri büyük / küçük harfe duyarlı değildir. URL'nin geri kalanı, yani yol ve sorgu büyük / küçük harfe duyarlı olmalıdır. w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3
Darrel Miller

10
Daniel, haklısın, işaret ettiğin için teşekkürler. Bununla birlikte, fiili olarak, genellikle URL'lerin, özellikle kaynak adı bölümü olmak üzere, vakaları yoksaymasını bekleriz.
Userid ve UserId'in

18
@LiorH: Sizce büyük / küçük harfe duyarlı olmanın "hiçbir anlamı yok". Pek çok diğer bağlam iyi etkiye büyük / küçük harfe duyarlıdır. Bazı web hizmetleri (örneğin Amazon S3) olan do URL uç noktaları için küçük harf duyarlılığı zorlamak ve bunu oldukça uygun olduğunu düşünüyorum.
Hank

6
Ben fena halde yanılmıyorsam @Dennis Windows sunucu dosya sistemleri, varsayılan olarak küçük harfe duyarlı değildir technet.microsoft.com/en-us/library/cc725747.aspx
samspot

5
@samspot İyi biri! Ben sunucuları oluştururken windows doğrudan hassas dosya adlarına gittiğini düşündüm. Vay canına, onlar hala onlar için "1 MicroSoft Way" sürece onlar iterek. ;-)
Dennis

87

Dropbox , Twitter , Google Web Services ve Facebook için REST API alt çizgi kullanır.


24
Bunun yan etkilerinden biri, vurgulanan 'kelimelerin' Google'ın arama dizinlerinde bir arada tutulmasıdır. Hyhenated olanlar ayrı kelimelere bölünür.
Dennis


11
Google Haritalar API'sı alt çizgiler kullanıyor olsa da, Google Stil Kılavuzu için Deve Kılıfı gerekir. Google+ API ve Özel Arama API diğerleri arasında, Deve Kılıfı kullanmak.
Benjamin

2
Yine de şu URL'leri ayırıcı olarak hala '-' kullanıyorlar: P developers.google.com/custom-search/json-api/v1/reference/cse/… developers.google.com/+/best-practices dev.twitter. com / genel bakış / vaka çalışmaları Öte yandan, sorgu parametrelerinde camelCase kullanırlar.
Mattias

1
Kimse bilmiyor ...
Piotr Kula

84

Sıradan web kaynakları için URI'lere yakından bakın. Bunlar senin şablonun. Dizin ağaçlarını düşünün; Linux benzeri basit dosya ve dizin adlarını kullanın.

HelloWorldgerçekten iyi bir kaynak sınıfı değil. Bu bir "şey" gibi görünmüyor. Öyle olabilir, ama isim gibi değil. birgreeting bir şeydir.

user-idgetirdiğiniz bir isim olabilir. Ancak, isteğinizin sonucunun yalnızca bir kullanıcı_kimliği olduğundan şüpheleniliyor. İsteğin sonucunun bir Kullanıcı olması çok daha olasıdır. Bu nedenle, usergetirdiğiniz isim

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

Bana mantıklı geldi. REST isteğinizi bir tür isim ifadesi yapmaya odaklayın - bir hiyerarşi (veya sınıflandırma veya dizin) üzerinden geçen bir yol. Mümkünse isim ifadelerinden kaçınarak mümkün olan en basit isimleri kullanın.

Genel olarak, bileşik ad ifadeleri genellikle hiyerarşinizde başka bir adım anlamına gelir. Yani sahip değilsin /hello-world/user/ve /hello-universe/user/. You have /hello/world/user/ve hello/universe/user/. Veya muhtemelen /world/hello/user/ve /universe/hello/user/.

Mesele, kaynaklar arasında bir gezinme yolu sağlamaktır.


4
Sorum daha çok, olası yol adlarının ve / veya sorgu dizesi parametrelerinin ne olursa olsun adlandırılmaları ile ilgili. Tasarım önerilerini kabul ediyorum, bu yüzden teşekkür ederim, ancak bu soru ile sadece konvansiyonları adlandırmayı istiyorum.
jnorris

1
Sadece, hiyerarşik olmayan kaynaklar için REST'i kullanmanızı engelleyen hiçbir şey yoktur. Kullandığınız gerçek URI adlandırma kuralları önemsizdir, sadece güzel göründüğünüzü kullanın ve sunucuda ayrıştırmanız kolaydır. Yanıtlarınızdaki köprü metni aracılığıyla URI'leri kaynaklara göndermeniz gerektiğinden, istemci URI'lerinizi oluşturma hakkında hiçbir şey bilmemelidir.
aehlke

30

'UserId' tamamen yanlış bir yaklaşımdır. Fiil (HTTP Yöntemleri) ve İsim yaklaşımı, Roy Fielding'in REST mimarisi için kastettiği şeydir . İsimler:

  1. Bir şeyler koleksiyonu
  2. Bir şey

İyi bir adlandırma kuralı:

[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} şunlardan biridir: json, xml, rss, pdf, png, hatta html.

Sonuna bir 's' ekleyerek koleksiyonu ayırt etmek mümkündür, örneğin:

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

Ancak bu, 's'leri nereye koyduğunuzu ve nereye koymadığınızı takip etmeniz gerektiği anlamına gelir. Ayrıca gezegenin yarısı (yeni başlayanlar için Asyalılar), açık çoğulları olmayan dilleri konuşur, böylece URL onlar için daha az dost olur.


{Var} ile ne kastedilmektedir? Bir kullanıcı adına göre ararsam, örneğin ... / user / username / tomsawyer?
Hans-Peter Störr

1
X, y, z adında üç değişkeniniz varsa (var), URL'niz şöyle görünür: sub.domain.tld / x / value_of_x / y / value_of_y / z / value_of_z
Dennis

@hstoerr Sadece açık olduğumdan emin olmak için, çoğu script dili bir çeşit 'kıvırcık parantez değişkeni' kullanıyor. Bu nedenle {var}, bazı değişkenlerin (adının) orada bulunduğunu belirtir ve bu nedenle, aşağıdaki {value}, {var} değerinin kendisinden önceki olduğu yerdir. Örnek: sub.domain.tld / script / {var} / {value} .json [www.yelp.com/foodxx/review_averages_higher_than/4.json], gıda gösterileri için yelp.com'dan json sonuçlarını almaya çalışıyor 4'ten yüksek bir değer
Dennis

Bu benim görüşüme göre en iyi cevap ve uluslararası düşünmek için kudos.
beiller

14

Hayır. REST'in URI adlandırma kurallarıyla hiçbir ilgisi yoktur. Bu kuralları API'nizin bir parçası olarak bant dışı, yalnızca köprü metni olarak dahil ederseniz, API'nız RESTful değildir.

Daha fazla bilgi için, bkz. Http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven


44
Biraz dinlen ... güzel görünen URL'lere sahip olmak hala güzel.
HDave

1
@HDave ile hemfikir olun, kolayca anlaşılabilen URL'lere sahip olmak REST'in ruhunda çok fazla. URL'lerle çalışıyorsunuz, neden kodunuzdaki değişken ve parametre adları kadar kolay anlaşılmalarını istemiyorsunuz?
mahemoff

4
@mahemoff özür dilerim, bu benim süper bilgiçim. Ancak URL'lerinizin neye benzediğinin REST ile hiçbir ilgisi yoktur. Bu, sahip olmaları için iyi bir şey olmadığı anlamına gelmez, sadece REST'in tanımladığı şeylerle diktirler. REST'in URL'leri bu şekilde yapılandırmakla ilgili olduğunu söylemek yanıltıcıdır, çünkü RPC API'larını okunabilir / yapılandırılmış URL'leri olduğu için REST olarak tanımlayan kişilere yol açar.
aehlke

5
Özetle, hoş görünen URL'ler harika ve herkesin sahip olması gerekir. Yine de REST ile ilgisi yoktur.
aehlke

1
@aehlke bunu temizlediğiniz için teşekkürler. Geri kalanı URL yapılarıyla ilgili değildir. İnsanların anlamasının neden bu kadar zor olduğunu anlamıyorum.
user1431072

9

Alan adları büyük / küçük harfe duyarlı değildir, ancak URI'nin geri kalanı kesinlikle olabilir. URI'lerin büyük / küçük harfe duyarlı olmadığını varsaymak büyük bir hatadır.



2

Bu örnekte deve davasının sorun olduğunu düşünmüyorum, ancak yukarıdaki örnek için daha RESTful adlandırma kuralı olacağını hayal ediyorum:

api.service.com/helloWorld/userId/x

daha sonra userId'i bir sorgu parametresi (mükemmel bir şekilde yasal olan) yapmak örneğim bu kaynağı IMO'da daha RESTful bir şekilde gösterir.


Bu bir RESTful API tasarımı meselesi değil, kullanılan yol bileşenleri ve / veya kullanılan sorgu dizesi parametreleri için kullanılacak adlandırma kuralları kılavuzudur. Örneğin, yol bileşenleri kullandığınız gibi deve kapaklarında mı yoksa alt çizgilerde mi olmalıdır?
jnorris

REST'te URL'leriniz arayüzleriniz olduğundan, bu bir tür API sorusudur. Örneğinize özgü herhangi bir yönerge olduğunu düşünmese de, şahsen deve davasıyla giderdim.
Gandalf

HTTP yığınının herhangi bir düzeyinde önbelleğe alınmasını istediğiniz kaynaklar için sorgu parametrelerini kullanmamalısınız.
aehlke

@aehlke Tam tersi de geçerlidir. Sorgu parametrelerinin önbelleğe alınmasını istemiyorsanız, parametreler için GET stilini kullanın, ~ VEYA ~ önbelleğe alınmasını istemediğiniz her şey için önbellek önleme üstbilgilerini değiştirmek / eklemek için DARN SURE yapın. Ayrıca, nesne / sayfa yinelemesinin karması olan bazı üstbilgilerdir, önbelleğe alınmasını istediğiniz, ancak düzenlemeler olduğunda güncellenen şeylerin değişikliklerini belirtmek için bunu kullanın.
Dennis

@aehlke Önbelleğe alma hakkında bilgi edinin ve ekliyorum. Speedups birinin tüm bu üstbilgileri yaptığı ve daha sonra uzun bir önbellek süresi sonra yeni bir sürüm sunucuya sunucuları ve vekil sunucu almak için içeriği değiştiğinde dosya adını ve tüm başvuruları değiştiren bir CodeCamp sunumu hatırlıyorum Ayarlamak. İşte tüm kanlı ayrıntılar: developers.google.com/speed/docs/best-practices/caching
Dennis

2

Müşterilerinizi Oauth2 ile doğrularsanız, parametre adlarınızdan en az ikisinin altını çizmeniz gerektiğini düşünüyorum:

  • Müşteri Kimliği
  • client_secret

CamelCase'i (henüz yayınlanmadı) REST API'mde kullandım. API belgelerini yazarken, diğer parametreler olmasa da Oauth parametrelerinin neden snake_case olduğunu açıklamak zorunda olmadığım için her şeyi snake_case olarak değiştirmeyi düşünüyordum.

Bkz. Https://tools.ietf.org/html/rfc6749


0

REST URL'lerinde mümkün olduğunca az özel karakter kullanmanın tercih edilebilir olduğunu söyleyebilirim. REST'in avantajlarından biri, bir hizmet için "arabirimi" okumayı kolaylaştırmasıdır. Deve durumu veya Pascal durumu muhtemelen kaynak adları için iyidir (Kullanıcılar veya kullanıcılar). REST çevresinde gerçekten zor standartlar olduğunu düşünmüyorum.

Ayrıca, Gandalf haklı olduğunu düşünüyorum, genellikle sorgu dizesi parametrelerini kullanmak değil, bunun yerine hangi kaynakları ele almak istediğinizi tanımlayan yollar oluşturmak REST daha temiz.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.