Büyük şirketlerin REST API'lerini tasarladıklarını gördüğüm tüm yollara dayanarak REST'in nasıl düzgün bir şekilde kullanılacağı konusunda biraz karışık olmak anlaşılabilir.
REST'in bir Kaynak Toplama sistemi olduğu konusunda haklısınız. Temsil Devlet Transferi anlamına gelir. Bana sorarsan iyi bir tanım değil. Ancak ana kavramlar 4 HTTP VERB ve vatansız olmaktır.
Unutulmaması gereken önemli nokta, REST ile sadece 4 VERBS olması. Bunlar GET, POST, PUT ve DELETE'dir. Sizin resend
örnek REST yeni Fiil eklemek. Bu bir kırmızı bayrak olmalı.
Soru 1
REST API'nizin arayanının, PUT
koleksiyonunuzda bir gerçekleştirmenin bir e-postanın oluşturulmasına neden olacağını bilmesi gerekmediğini fark etmek önemlidir . Bu bana bir sızıntı kokuyor. Bildikleri şey, bir gerçekleştirmenin PUT
daha sonra sorgulayabilecekleri ekstra görevlerle sonuçlanabileceğidir. Bunu GET
yakın zamanda oluşturulan bir kaynak üzerinde bir gerçekleştirerek bilirlerdi . Bu GET
, kaynağı ve Task
onunla ilişkili tüm kaynak kimliklerini döndürür . Daha sonra durumlarını belirlemek ve hatta yeni bir görev göndermek için bu görevleri sorgulayabilirsiniz Task
.
Birkaç seçeneğiniz var.
REST - Görev kaynağı tabanlı yaklaşım
tasks
Eylemleri gerçekleştirmek için sisteminize belirli görevleri gönderebileceğiniz bir kaynak oluşturun . Daha sonra GET
görevi, ID
durumunu belirlemek için döndürülen görevi temel alarak yapabilirsiniz .
Ya da SOAP over HTTP
mimarinize RPC eklemek için bir Web Hizmeti ile karışabilirsiniz .
belirli bir kaynağın tüm görevleri için sorgulama
GET http://server/api/myCollection/123/tasks
{ "tasks" :
[ { "22333" : "http://server/api/tasks/223333" } ]
}
görev kaynağı örneği
PUT http://server/api/tasks
{
"type" : "send-email" ,
"parameters" :
{
"collection-type" : "foo" ,
"collection-id" : "123"
}
}
==> görevin kimliğini döndürür
223334
GET http://server/api/tasks/223334
{
"status" : "complete" ,
"date" : "whenever"
}
REST- Eylemleri tetiklemek için POST kullanma
POST
Bir kaynağa her zaman ek veriler ekleyebilirsiniz. Bence bu REST'in ruhunu ihlal edecek ama yine de uyumlu olacaktı.
Buna benzer bir POST yapabilirsiniz:
POST http://server/api/collection/123
{ "action" : "send-email" }
Toplamadan 123 kaynağını ek verilerle güncelleyeceksiniz. Bu ek veriler temel olarak arka uca bu kaynak için bir e-posta göndermesini söyleyen bir eylemdir.
Bununla ilgili sorun GET
kaynak üzerinde bir bu güncellenmiş verileri döndürecek olmasıdır. Ancak, bu gereksinimlerinizi çözer ve yine de RESTful olur.
SOAP - REST'ten alınan kaynakları kabul eden Web Hizmeti
REST API'sinden önceki kaynak kimliğine göre e-posta gönderebileceğiniz yeni bir WebService oluşturun. Burada SOAP hakkında ayrıntıya girmeyeceğim, çünkü asıl soru REST ile ilgilidir ve bu iki kavram / teknoloji Elma ve Portakal olarak karşılaştırılmamalıdır .
soru 2
Burada birkaç seçeneğiniz de var:
REST API'lerini yayınlayan birçok büyük şirket, search
kaynakları döndürmek için sorgu parametrelerini iletmenin bir yolu olan bir koleksiyon ortaya koyuyor.
GET http://server/api/search?q="type = myCollection & someField >= someval"
Bu, aşağıdakiler gibi tam nitelikli REST kaynaklarının bir koleksiyonunu döndürür:
{
"results" :
{ [
"location" : "http://server/api/myCollection/1",
"location" : "http://server/api/myCollection/9",
"location" : "http://server/api/myCollection/56"
]
}
}
Veya bir sorgu parametresi olarak MVEL gibi bir şeye izin verebilirsiniz .
Soru 3
Geri gitmek ve bir sorgu parametresi ile diğer kaynağı sorgulamak zorunda daha alt düzeylerini tercih ederim. Ben şu ya da bu şekilde herhangi bir kural olduğuna inanmıyorum. Her iki yolu da uygulayabilir ve arayan kişinin sisteme ilk girme şekline göre hangisinin daha uygun olduğuna karar vermesini sağlayabilirsiniz.
notlar
Başkalarının okunabilirlik yorumlarına katılmıyorum. Bazılarının ne düşündüğüne rağmen REST hala insan tüketimi için değildir. Makine tüketimi içindir. Tweetlerimi görmek istersem Twitters normal web sitesini kullanırım. Onların API ile bir REST GET gerçekleştirmiyorum. Programlı olarak tweetlerimle bir şey yapmak istersem REST API'lerini kullanırım. Evet, API'lar anlaşılabilir olmalıdır, ancak gte
o kadar da kötü değil, sadece sezgisel değil.
REST ile ilgili bir diğer önemli şey, API'nızdaki herhangi bir verme noktasında başlayabilmeniz ve diğer kaynakların tam URL'sini önceden bilmeden İLGİLİ diğer tüm kaynaklara gidebilmenizdir. GET
REST'teki VERB sonuçları başvurduğu kaynakların tam REST URL'sini döndürmelidir. Dolayısıyla, bir Person
nesnenin kimliğini döndüren bir sorgu yerine , Tam Nitelikli URL gibi döner http://server/api/people/13
. Ardından, URL değişse bile sonuçlarda her zaman programlı olarak gezinebilirsiniz.
Yoruma yanıt
Gerçek dünyada aslında bir kaynak yaratma, okuma, güncelleme veya silme (CRUD) yapmayan şeyler olması gerekir.
Kaynaklar hakkında ek önlemler alınabilir. Tipik ilişkisel veritabanları Saklı Yordamlar kavramını destekler. Bunlar, bir veri kümesi üzerinde yürütülebilen ek komutlardır. REST'in doğası gereği bu konsepti yoktur. Ve yapması için hiçbir neden yok. Bu tür eylemler RPC veya SOAP Web Hizmetleri için mükemmeldir.
REST API'lerinde gördüğüm genel sorun budur. Geliştiriciler, REST'i çevreleyen kavramsal sınırlamaları sevmiyorlar, bu yüzden onu istedikleri gibi uyarlıyorlar. Bu olsa RESTful bir hizmet olmaktan keser. Esasen bu URL'ler GET
sözde REST benzeri sunucu uygulamalarına çağrı yapar.
Birkaç seçeneğiniz var:
- Görev kaynağı oluşturma
POST
Bir eylem gerçekleştirmek için kaynağa ek verilerin desteklenmesi .
- Ek komutları bir SOAP Web Hizmeti aracılığıyla ekleyin.
E-postayı yeniden göndermek için hangi HTTP VERB'yi kullanırsanız bir sorgu parametresi kullandıysanız?
GET
- Bu, e-postayı yeniden gönderiyor mu ve kaynağın verilerini döndürüyor mu? Bir sistem söz konusu URL'yi önbelleğe alıp söz konusu kaynağın benzersiz URL'si gibi davranırsa ne olur? URL'yi her vurduklarında bir e-postayı yeniden gönderir.
POST
- Kaynağa yeni bir veri göndermediniz, sadece ek bir sorgu parametresi.
Verilen tüm gereksinimlere bağlı POST
olarak, kaynak action field
olarak POST verisi ile bir kaynak yapmak sorunu çözecektir.