URL'lerinizin görünümünün REST ile hiçbir ilgisi yoktur. Her şey olur. Aslında bir "uygulama detayı" dır. Yani değişkenlerinizi nasıl adlandırdığınız gibi. Olmaları gereken tek şey eşsiz ve dayanıklıdır.
Bu konuda çok fazla zaman kaybetmeyin, sadece bir seçim yapın ve ona bağlı kalın / tutarlı olun. Örneğin, hiyerarşilerle giderseniz, bunu tüm kaynaklarınız için yaparsınız. Sorgu parametreleri ile giderseniz ... vb kodunuzdaki adlandırma kuralları gibi.
Neden öyle ? Bildiğim kadarıyla "RESTful" API göz atılabilir olmalı (biliyorsunuz ... "Uygulama Durumunun Motoru Olarak Hipermedya"), bu nedenle bir API istemcisi URL'lerinizin neye benzediklerini umursamıyor geçerli (SEO yok, bu "dost URL'leri" okuması gereken insan yok, hata ayıklama hariç ...)
Bir URL'nin bir REST API'sinde ne kadar hoş / anlaşılır olması, kodunuzdaki bir değişkenin adı gibi API istemcisi değil, yalnızca API geliştiricisi olarak sizi ilgilendirir.
En önemli şey, API istemcinizin medya türünüzü nasıl yorumlayacağını bilmesidir. Örneğin şunu bilir:
- medya türünüzde kullanılabilir / ilgili bağlantıları listeleyen bir bağlantılar özelliği bulunur.
- Her bağlantı bir ilişki ile tanımlanır (tıpkı tarayıcıların [rel = "stylesheet"] bağlantısının bir stil sayfası veya rel = favico'nun bir favicon bağlantısı olduğunu bildiği gibi ...)
- ve bu ilişkilerin ne anlama geldiğini bilir ("şirketler" şirketlerin bir listesi, "arama", kaynak listesinde arama yapmak için şablonlanmış bir url anlamına gelir, "departmanlar", mevcut kaynağın departmanları anlamına gelir)
Aşağıda örnek bir HTTP değişimi bulunmaktadır (yazılması daha kolay olduğu için gövdeler yaml dosyasındadır):
İstek
GET / HTTP/1.1
Host: api.acme.io
Accept: text/yaml, text/acme-mediatype+yaml
Yanıt: ana kaynağa olan bağlantıların bir listesi (şirketler, insanlar, her neyse ...)
HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:04:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml
# body: this is your API's entrypoint (like a homepage)
links:
# could be some random path https://api.acme.local/modskmklmkdsml
# the only thing the API client cares about is the key (or rel) "companies"
companies: https://api.acme.local/companies
people: https://api.acme.local/people
Talep: şirketlere bağlantı (önceki yanıtın body.links.şirketlerini kullanarak)
GET /companies HTTP/1.1
Host: api.acme.local
Accept: text/yaml, text/acme-mediatype+yaml
Yanıt: şirketlerin kısmi bir listesi (öğeler altında), kaynak sonraki birkaç şirketi (body.links.next) aramak için başka bir (templated) bağlantı (body.links.search) almak için bağlantı gibi ilgili bağlantılar içerir.
HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:06:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml
# body: representation of a list of companies
links:
# link to the next page
next: https://api.acme.local/companies?page=2
# templated link for search
search: https://api.acme.local/companies?query={query}
# you could provide available actions related to this resource
actions:
add:
href: https://api.acme.local/companies
method: POST
items:
- name: company1
links:
self: https://api.acme.local/companies/8er13eo
# and here is the link to departments
# again the client only cares about the key department
department: https://api.acme.local/companies/8er13eo/departments
- name: company2
links:
self: https://api.acme.local/companies/9r13d4l
# or could be in some other location !
department: https://api2.acme.local/departments?company=8er13eo
Gördüğünüz gibi, URL'lerinizin yol kısmını nasıl yapılandıracağınız bağlantılar / ilişkiler yoluna giderseniz API istemcinize herhangi bir değeri yoktur. URL'lerinizin yapısını müşterinize dokümantasyon olarak iletiyorsanız, REST (veya " Richardson'ın olgunluk modeli " uyarınca en azından Seviye 3) yapmıyorsunuz )