Görünüşe göre REST, HTTP'nin nasıl kullanılacağına dair bir dizi konvansiyon . Bu sözleşmelerin hangi avantajı sağladığını merak ediyorum. Kimse biliyor mu?
Görünüşe göre REST, HTTP'nin nasıl kullanılacağına dair bir dizi konvansiyon . Bu sözleşmelerin hangi avantajı sağladığını merak ediyorum. Kimse biliyor mu?
Yanıtlar:
Ben kimse gerçekten DİNLENME ne kabul eder kısmen, bu iyi bir cevap almak sanmıyorum olduğunu . Wikipedia sayfası kodlardan ağır ve açıklamalar konusunda hafiftir. Tartışma sayfası, insanların bu konuda ne kadar katılmadıklarını görmek için bir bakıma değer. Ancak söyleyebildiğim kadarıyla REST şu anlama gelir:
Bunun yerine rastgele adlandırılmış ayarlayıcı ve alıcı URL'ler sahip ve kullanmanın GET
tüm alıcılar ve POST
ayarlayıcılar herkes için, biz URL'lerin kaynakları belirlemek için deneyin ve ardından HTTP işlemleri kullandığınızda GET
, POST
, PUT
ve DELETE
onlara bir şeyler yapmak. Yani yerine
GET /get_article?id=1
POST /delete_article id=1
Yapardın
GET /articles/1/
DELETE /articles/1/
Ve sonra POST
ve PUT
denk gelen "yaratmak" ve "güncelleme" operasyonları (ama kimse hangi yolu yuvarlak kabul eder) için.
Ben sorgu dizeleri nedeniyle önbelleğe alma argümanlar yanlış olduğunu düşünüyorum edilir genellikle önbelleğe, ve gerçekten gerek yoktur yanında bunları kullanmak. Örneğin, django böyle bir şeyi çok kolaylaştırır ve REST olduğunu söyleyemem:
GET /get_article/1/
POST /delete_article/ id=1
Ya da sadece fiili URL'ye ekleyin:
GET /read/article/1/
POST /delete/article/1/
POST /update/article/1/
POST /create/article/
Bu durumda GET
yan etkileri olmayan bir POST
şey ve sunucudaki verileri değiştiren bir şey anlamına gelir. Sana bütün önleyebilirsiniz, özellikle de bu belki de biraz daha net ve daha kolay olduğunu düşünüyorum PUT
rakip olduğunu- POST
şey. Ayrıca, isterseniz daha fazla fiil ekleyebilirsiniz, böylece HTTP'nin sunduklarına yapay olarak bağlı değilsiniz. Örneğin:
POST /hide/article/1/
POST /show/article/1/
(Ya da her neyse, örnekleri olana kadar düşünmek zor!)
Sonuç olarak, görebildiğim sadece iki avantaj var:
synchronize("/articles/1/")
ya da her neyse. Bu büyük ölçüde kodunuza bağlıdır.Ancak bazı oldukça büyük dezavantajlar olduğunu düşünüyorum:
PUT
ve hangi yöne doğru karışıklık POST
. İngilizce de benzer şeyleri kastediyorlar ("Duvara bir bildirim koyacağım / yayınlayacağım.").Sonuç olarak şunu söyleyebilirim: Ekstra çabaya gerçekten gitmek istemiyorsanız veya hizmetiniz CRUD işlemleriyle gerçekten iyi eşleşmediyse, API'nizin ikinci sürümü için REST'i kaydedin.
REST ile başka bir sorunla karşılaştım: Bir istekte birden fazla şey yapmak veya bileşik nesnenin hangi bölümlerini almak istediğinizi belirtmek kolay değil. Bu, gidiş-dönüş süresinin önemli olabileceği ve bağlantıların güvenilir olmadığı mobil cihazlarda özellikle önemlidir. Örneğin, bir facebook zaman çizelgesinde yayınlar aldığınızı varsayalım. "Saf" REST yolu şöyle bir şey olurdu
GET /timeline_posts // Returns a list of post IDs.
GET /timeline_posts/1/ // Returns a list of message IDs in the post.
GET /timeline_posts/2/
GET /timeline_posts/3/
GET /message/10/
GET /message/11/
....
Bu biraz saçma. Facebook'un API'sı oldukça harika bir IMO, bu yüzden ne yaptıklarına bakalım:
Varsayılan olarak, sorgu yaptığınızda çoğu nesne özelliği döndürülür. "Alanlar" sorgu parametresi ile döndürülmesini istediğiniz alanları (veya bağlantıları) seçebilirsiniz. Örneğin, bu URL yalnızca Ben'in kimliğini, adını ve resmini döndürür: https://graph.facebook.com/bgolub?fields=id,name,picture
REST ile böyle bir şeyi nasıl yapacağınız hakkında hiçbir fikrim yok ve eğer hala REST olarak sayılıp sayılmayacağını biliyorsunuz. Kesinlikle bunu yapmamanız gerektiğini söylemeye çalışan herkesi görmezden gelirim (özellikle sebebi "REST olmadığı için" ise)!
/user/{id}
, o zaman bu kadar rahat değildir." sayfa
Basitçe söylemek gerekirse, REST, HTTP'yi olması gerektiği gibi kullanmak anlamına gelir.
Roy Fielding'in REST hakkındaki tezine bir göz atın . Web geliştirme yapan herkesin okuması gerektiğini düşünüyorum.
Not olarak, Roy Fielding, HTTP protokolünün arkasındaki anahtar sürücülerden biridir.
Bazı avantajları adlandırmak için:
Basitçe söylemek gerekirse: HİÇBİRİ .
Oy vermekten çekinmeyin, ancak yine de REST olmayan HTTP'ye göre gerçek bir faydası olmadığını düşünüyorum. Mevcut tüm cevaplar geçersiz. Şu anda en çok oylanan cevaptan gelen argümanlar:
REST ile sunucu tarafı ve istemci tarafı komut dosyalarınız için ek iletişim katmanına ihtiyacınız vardır => aslında REST olmayan HTTP kullanmaktan daha karmaşıktır.
Önbellekleme, sunucu tarafından gönderilen HTTP üstbilgileri tarafından denetlenebilir. REST, REST olmayan öğelerde eksik olan hiçbir özellik eklemez.
REST, bir şeyler düzenlemenize yardımcı olmaz . Bu zorlar kullandığınız sunucu tarafı kütüphanesi tarafından desteklenen API kullanmak için. REST dışı yaklaşımı kullanırken uygulamanızı aynı şekilde (veya daha iyi) düzenleyebilirsiniz. Örneğin bkz. Model-View-Controller veya MVC yönlendirmesi .
Hiç doğru değil. Her şey başvurunuzu ne kadar iyi organize ettiğinize ve belgelediğinize bağlıdır. REST, uygulamanızı sihirli bir şekilde daha iyi hale getirmeyecektir.
IMHO, REST'in sağladığı en büyük avantaj, istemci / sunucu bağlantılarını azaltmaktır. Mevcut istemcileri bozmadan bir REST arayüzünü zaman içinde geliştirmek çok daha kolaydır.
Her kaynağın, hiyerarşi veya bağlantılardaki diğer kaynaklara referansları vardır, bu nedenle etrafta gezinmek kolaydır. Bu, müşteriyi geliştiren, dokümanlara sürekli danışmaktan kaçınan ve öneriler sunan bir avantajdır. Ayrıca, sunucunun kaynak adlarını tek taraflı olarak değiştirebileceği anlamına gelir (istemci yazılımı URL'leri kodlamadığı sürece).
API'nın herhangi bir bölümüne girebilir veya kaynaklarda gezinmek için web tarayıcısını kullanabilirsiniz. Hata ayıklama ve test entegrasyonunu kolaylaştırır.
Doğru ifadeyi avlamak zorunda kalmadan eylemleri belirtmenizi sağlar. OOP Alıcılar ve ayarlayıcılar standardize edilmemiştir ve bazı insanlar kullanılan düşünün retrieve
ve define
onun yerine. Her bir erişim noktası için doğru fiili ezberlemeniz gerekir. Bu sorunu sadece bir avuç fiil kullanılabilir sayaçları bilmek.
Eğer GET
var olmayan bir kaynak, bir olsun emin olabilir 404
dinlendirici API hatası. {error: "Not found"}
Tanrı'ya sarılmış geri dönebilecek RESTful olmayan bir API ile kontrast kaç katman bilir. Diğer taraftaki geliştiriciye bir mesaj yazmak için fazladan alana ihtiyacınız varsa, her zaman yanıtın gövdesini kullanabilirsiniz.
Biri REST'i takip eden ve diğeri takip etmeyen aynı işlevselliğe sahip iki API düşünün. Şimdi bu API'lar için aşağıdaki istemcileri düşünün:
RESTful:
GET /products/1052/reviews
POST /products/1052/reviews "5 stars"
DELETE /products/1052/reviews/10
GET /products/1052/reviews/10
HTTP:
GET /reviews?product_id=1052
POST /post_review?product_id=1052 "5 stars"
POST /remove_review?product_id=1052&review_id=10
GET /reviews?product_id=1052&review=10
Şimdi aşağıdaki soruları düşünün:
Her müşterinin ilk çağrısı çalıştıysa, geri kalanının da işe yarayacağından nasıl emin olabilirsiniz?
API'da bu erişim noktalarını değiştirmiş veya değiştirmemiş olabilecek büyük bir güncelleme yapıldı. Ne kadar dokümanı yeniden okumak zorunda kalacaksınız?
Son sorgunun dönüşünü tahmin edebilir misiniz?
Gönderilen incelemeyi düzenlemeniz gerekir (silmeden önce). Belgeleri kontrol etmeden yapabilir misiniz?
Ryan Tomayko'nun Eşime REST'i Nasıl Anlattığına Bir Bakış
Waybackmaschine bağlantısından alıntı:
Nasıl bir örnek. Siz bir öğretmensiniz ve öğrencileri yönetmek istiyorsunuz:
Sistemler web tabanlı ise, o zaman muhtemelen burada yer alan isimlerin her biri için bir URL vardır: student, teacher, class, book, room, etc
. ... Her URL için makine tarafından okunabilir bir sunum olsaydı, sisteme yeni araçların takılması önemsiz olurdu, çünkü tüm bu bilgiler standart bir şekilde tüketilebilirdi. ... sınav puanlarını toplamak için her bir okul sistemi ile konuşabilen ülke çapında bir sistem oluşturabilirsiniz.
Sistemlerin her biri basit bir HTTP GET kullanarak birbirlerinden bilgi alacaktır. Bir sistemin başka bir sisteme bir şey eklemesi gerekiyorsa, HTTP POST kullanır. Bir sistem başka bir sistemdeki bir şeyi güncellemek istiyorsa, bir HTTP PUT kullanır. Anlaşılması gereken tek şey verinin nasıl görünmesi gerektiğidir.
Bu soruya cevap arayan herkese bu "slayt gösterisinden" geçmelerini öneririm .
REST'in ne olduğunu ve neden bu kadar havalı olduğunu, artılarını ve eksilerini, SABUN'dan farklılıkları anlayamadım - ama bu slayt gösterisi çok parlak ve kolay anlaşıldı, bu yüzden şimdi benim için öncekinden çok daha açık.
Önbelleğe almak.
Gevşek bağlantı ve hipermetin yoluyla evrimleşme yeteneği etrafında dönen REST'in daha ayrıntılı faydaları vardır, ancak önbelleğe alma mekanizmaları RESTful HTTP'yi önemsemenizin ana nedenidir.
GET /get_article/19/
ve POST /update_article
önbelleğe almanız endişenizse. Hala sadece ile her şeyi yapabilirsiniz GET
ve POST
ve inanıyorum REST
"Kullanım araçları GET
, POST
, PUT
ve DELETE
sadece." yalnızca "Sorgu dizeleri kullanma" değil. yani önerdiğim şey olmazdı REST
. Sonra tekrar, kimse gerçekten ne REST
olduğunu kabul edemez bu yüzden "Web 2.0" ile bir kova koymak.
Fielding tezinde yazılmıştır . Ama çok okumak istemiyorsanız:
Her şeyi sadece POST ve GET ile yapmak mümkün mü? Evet, en iyi yaklaşım bu mu? Hayır neden? çünkü standart yöntemlerimiz var. Tekrar düşünürseniz, sadece GET'i kullanarak her şeyi yapmak mümkün olabilir .. Öyleyse neden POST'u kullanmaktan rahatsız olmalıyız? Standartlar yüzünden!
Örneğin, bugün bir MVC modeli düşünerek, başvurunuzu yalnızca POST, GET, PUT ve DELETE gibi belirli fiillere yanıt verecek şekilde sınırlayabilirsiniz. Kaputun altında her şey POST ve GET'e benzetilse bile, farklı eylemler için farklı fiillere sahip olmak mantıklı değil mi?
REST'te keşif çok daha kolay. Hizmetinizi dünyaya tanıtmanıza yardımcı olacak WADL belgelerine (geleneksel web hizmetlerindeki WSDL'ye benzer) sahibiz. UDDI keşiflerini de kullanabilirsiniz. Geleneksel HTTP POST ve GET kullanıcıları, sizi aramak için mesaj isteğinizi ve yanıt şemalarınızı bilmeyebilir.
Bir avantajı, XML belgelerini ve InputStream nesnesi, URL, DOM düğümü gibi farklı kaynaklardan sıradan XML verilerini sıralı olarak işleyebilmemizdir ...
@Timmmm, düzenlemeniz hakkında:
GET /timeline_posts // could return the N first posts, with links to fetch the next/previous N posts
Bu, çağrı sayısını önemli ölçüde azaltacaktır
Ve hiçbir şey müşterilerinizin isteyebileceği alan değerlerini belirtmek için HTTP parametrelerini kabul eden bir sunucu tasarlamanızı engellemez ...
Ama bu bir detay.
Daha da önemlisi, REST mimari tarzının büyük avantajlarından bahsetmemenizdir (sunucu vatansızlığı nedeniyle çok daha iyi ölçeklenebilirlik; sunucu vatansızlığı nedeniyle çok daha iyi kullanılabilirlik; önbellekleme gibi standart hizmetlerin çok daha iyi kullanımı örneğin, bir REST mimari stili kullanılırken, tek tip bir arayüz kullanımı nedeniyle istemci ve sunucu arasında çok daha düşük bağlantı; vb.)
Yorumuna gelince
"Tüm eylemler kolayca CRUD ile eşleşmez (oluşturma, okuma / alma, güncelleme, silme)."
: RDBMS de bir CRUD yaklaşımı kullanır (SELECT / INSERT / DELETE / UPDATE) ve her zaman bir veri modelini temsil etmenin ve bu model üzerinde işlem yapmanın bir yolu vardır.
Cümle ile ilgili
"Nesne türü kaynaklarla ilgilenmiyor olabilirsiniz"
: RESTful tasarımı özünde basit bir tasarımdır - ancak bu tasarımın basit olduğu anlamına gelmez. Farkı görüyor musunuz? Bunu kaynaklarla temsil etmek için, uygulamanızın temsil edeceği ve ele alacağı kavramlar hakkında çok düşünmeniz gerekir, eğer tercih ederseniz, ne yapması gerekir. Ancak bunu yaparsanız, daha basit ve verimli bir tasarım elde edersiniz.
Sorgu dizeleri arama motorları tarafından yok sayılabilir.