REST ve CRUD arasındaki fark


168

REST'i öğrendim ve CRUD'a çok benziyor (CRUD hakkında okuduklarımdan).

Farklı olduklarını biliyorum ve benzer olduklarını düşünmek onları anlamadığım anlamına geliyor.

REST'in CRUD'un bir "süper" olduğu mu? Her şey CRUD mu ve daha fazlası mı?


17
Onlar benzer araçların oluşturulması Düşünme yok onları anlamak. Cevapları okurken , kavramlar arasındaki benzerlikleri kabul etmeme konusunda şaşırtıcı ve neyin yanlış olduğunu düşündüğümü görüyorum . REST anlamak için doğru yolu olduğuna inanıyoruz olan "HTTP kaynakları için CRUD" olarak düşünmek için. Bir HTTP kaynağının ne olduğunu anlarsanız (açıkça bir veritabanı kaydıyla aynı değildir) ve CRUD'un ne olduğunu biliyorsanız, REST'i "HTTP kaynakları için CRUD" olarak tanımlamak REST'in özünü iletmek için doğru ve özlü bir yoldur.
Jason Livesay

Yanıtlar:


205

Şaşırtıcı bir şekilde, diğer cevaplarda REST ve CRUD arasındaki gerçek farkı düşündüğümü görmüyorum: her birinin neyi yönettiğini.

CRUD, bir veri havuzunda yapılması gereken temel işlemleri ifade eder. Kayıtları veya veri nesnelerini doğrudan idare edersiniz; Bu işlemler dışında, kayıtlar pasif varlıklardır. Genelde sadece veritabanı tabloları ve kayıtlarıdır.

Öte yandan, REST, her biri bir URL ile tanımlanan kaynak sunumları üzerinde çalışır. Bunlar genellikle veri nesneleri değil, karmaşık nesne soyutlamalarıdır.

Örneğin, bir kaynak kullanıcının yorumu olabilir. Bu, sadece bir 'yorum' tablosundaki bir kayıt değil, aynı zamanda 'kullanıcı' kaynağıyla ilişkisinin, yorumun eklendiği gönderinin, belki de yanıtladığı bir başka yorumun anlamına gelir.

Yorum üzerinde çalışmak ilkel bir veritabanı işlemi değildir, orijinal postere uyarı vermek veya bazı oyun benzeri 'puanları' yeniden hesaplamak veya bazı 'takipçi akışlarını' güncellemek gibi önemli yan etkileri olabilir.

Ayrıca, bir kaynak gösterimi , tasarımcının kaynaklar arasındaki ilişkileri ifade etmesine izin veren veya bir işlemin iş akışında REST istemcisini yönlendiren izin veren köprü metni ( HATEOAS ilkesini kontrol edin) içerir .

Kısacası, CRUD bir dizi ilkel işlemdir (çoğunlukla veritabanları ve statik veri depoları için), REST ise çok yüksek düzeyde bir API tarzıdır (çoğunlukla web hizmetleri ve diğer 'canlı' sistemler için).

Bunlardan ilki temel verileri yönlendirir, diğeri karmaşık bir sistemle etkileşime girer.


3
@Javier Onları ayırdığınız için teşekkürler. REST öğrenme Rails'i kullandım ve CRUD'un yerine geçtiği izlenimini edindim. REST vs CRUD'yi 2 elmayı karşılaştırıp elmayı ve portakalı karşılaştırmaya çevirdi. Teşekkürler
Jesse Black

2
@Maudicus: RoR bir CRUD katmanı içerdiğinden (çoğu (her?) Çerçevenin yaptığı gibi) çok yaygın olduğunu düşünüyorum ve bunun üzerine bir REST API eklemeyi kolaylaştırıyor (otomatik?) tüm REST nedir. Ancak daha sonra, CRUD'un üstüne ancak REST API'nin arkasına işlevler ekleyerek bunları daha da farklı hale getirebilirsiniz.
Javier

1
Cevabınız doğru, ancak örnek en uygun değil: bir yorum tek bir db satırına kadar düşebilir ve db tetikleyicileri ile ilgili nesnelere dinamik değişiklikler uygulamak mümkün olmaz mı? Huzurlu api'de sadece ufak tefek operasyonlardan biraz daha fazlası olduğunu düşünüyorum ve cevabınız açıkça bu duyguyu taşıyor.
didierc

2
Yani ... aynı şey, farklı katman :)
AlikElzin-kilaka

Bunu ifade ettiğin için çok teşekkür ederim! HTTP fiillerinin CRUD işlemlerine sınırlandırılmasının, REST'in tam anlamıyla CRUD olarak uygulanmasıyla sonuçlanacağını, CRUD kazanını genelleştiren ve bu "yorumda işlem yapan" mantığı olan bu özel için bir yeri kaçıran araçlarla sonuçlanacağını da eklerdim.
sompylasar

99

Her şeyden önce, her ikisi de basitçe baş harflerdir; korkacak bir şey değiller.

Şimdi, CRUD kısaltılmış basit bir terimdir çünkü birçok uygulamada ortak bir özelliktir ve CRUD'u söylemek kolaydır . Veriler (veya bir kaynak) üzerinde gerçekleştirebileceğiniz 4 temel işlemi açıklar. Oluştur, Oku, Güncelle, Sil.

Ancak REST, kendi başına bir teknoloji değil, adlandırılmış bir uygulamadır (AJAX gibi). HTTP protokolünde uzun zamandır var olan, ancak nadiren kullanılan yeteneklerin kullanımını teşvik eder.

Bir URL'niz (Tekdüzen Kaynak Bulucu ) olduğunda ve tarayıcınızı adres satırına yönlendirdiğinizde, bir HTTP isteği gönderirsiniz . Her bir HTTP isteği, sunucunun isteği gönderen istemciye geri göndermek için hangi HTTP yanıtını bildiğini bilmek için kullanabileceği bilgiler içerir .

Her istek bir URL içerdiğinden, sunucu hangi kaynağa erişmek istediğinizi bilir , ancak bir yöntem de içerebilir . Bir yöntem bu kaynakla ne yapılacağını açıklar .

Ancak bu "yöntem" kavramı çok sık kullanılmadı.

Genellikle, insanlar yalnızca GET yöntemiyle sayfalara bağlanır ve POST yöntemi ile her türlü güncelleme (silme, ekleme, güncelleme) yayınlar.

Bu nedenle bir kaynağı (URL) kendi içinde gerçek bir kaynak olarak göremezsiniz. Aynı kaynağın silinmesi, eklenmesi veya güncellenmesi için ayrı URL’leriniz olması gerekiyordu. Örneğin:

http://...com/posts/create- POST request  -> Goes to posts.create() method in the server
http://...com/posts/1/show- GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1/delete - POST request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1/edit- POST request  -> Goes to posts.edit(1) method in the server

REST ile, POST dışında diğer HTTP yöntemlerini kullandıkları için daha akıllı formlar oluşturursunuz ve sunucunuzu yalnızca URL'leri değil, yöntemleri ayırt edebilmeleri için programlarsınız . Yani örneğin:

http://...com/posts - POST request  -> Goes to posts.create() method in the server
http://...com/posts/1 - GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1 - DELETE request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1 - PUT request  -> Goes to posts.edit(1) method in the server

Unutmayın, tek bir URL tek bir kaynağı tanımlar. Tek bir gönderi, tek bir kaynaktır. REST ile kaynakları tedavi edilmeleri gerektiği şekilde ele alırsınız. Sunucuya hangi kaynağı işlemek istediğinizi ve nasıl işleneceğini söylüyorsunuz.

İlgileniyorsanız Wikipedia'da, diğer makalelerde veya kitaplarda okuyabileceğiniz "RESTful mimarisi" nin birçok özelliği var. Öte yandan, CRUD'un kendisinde daha fazlası yok.


4
Üzgünüm ama DİNLENME olan CRUD çok daha fazla. çünkü kaynaklar, her biri tek bir kayıttan daha fazlasını içerdiğinden ve her işlem bir kaydı güncellemekten daha fazlasını yapar.
Javier

11
Tamam. Katılıyorum. Neden üzgünsün? CRUD'dan daha fazlası olmadığını söylemedim. Ben de aynen öyle dedim .
Yam Marcoviç

4
Bu doğru cevap olmalı.
Brandon,

HTML özelliği yalnızca form gönderme için GET ve POST yöntemlerine izin verir, bu nedenle diğer yöntemler AJAX yaygınlaşmadan önce web müşterilerinden gelen hizmetlerin isteklerinde kullanılmamıştır. Bazı hizmetler, POST yöntemini kullanarak formu gönderirken, POST dışındaki bir yöntemi belirtmek için geçici çözüm olarak "_method" adında gizli bir giriş alanı kullanır.
Kenneth Sundqvist

20

REST, "temsili durum aktarımı" anlamına gelir; bunun anlamı, bir sistemdeki bazı kaynakların durumunu iletmek ve değiştirmek demektir.

REST oldukça katı bir hal almaktadır, çünkü REST'in arkasındaki teori, uzaktaki bir sistemdeki bilgiyi yönetmek için medyayı, hypermedia'ı ve altta yatan bir protokolü kullanıyor.

CRUD, diğer taraftan, bir veri tabanındaki veriler için ihtiyaç duyduğunuz ortak işlemler için bir hatırlatıcıdır: Retrieve Update Delete Sil. Fakat bundan daha derine inemez.

Demek sorunuzun cevabı bu, ama REST ve CRUD birlikte tartışıldığında gördüğüm genel yanlıştan bahsedeceğim. Birçok geliştirici, REST'i doğrudan CRUD ile eşlemek ister, çünkü HTTP üzerinden REST, POST POST ve DELETE GET sağlarken, CRUD, CREATE RETRIEVE GÜNCELLEŞTİRME SİLME işlevini sağlar. REST fiillerini doğrudan CRUD işlemleriyle eşlemek doğaldır.

Bununla birlikte, HTTP bir "oluştur veya güncelle" stilini kullanırken, CRUD oluşturma ve güncellemeyi ayırır. Bu, ikisi (!) Arasında temiz, genel bir harita oluşturmayı imkansız kılar (!).

GET ve SİLME kolaydır ... GET === SİLME ve SİLME === SİLME.

Ancak, HTTP spesifikasyonuna göre, PUT aslında Yaratın ve Güncelleyin:

  • Tanımlayıcısı dahil, onunla ilgili her şeyi bildiğiniz zaman, yeni bir nesne oluşturmak için PUT kullanın.

  • Bir nesneyi güncellemek için PUT kullanın (genellikle nesneyi tam olarak gösterir)

POST "işleniyor" fiili ve "son" fiili olarak kabul edilir:

  • Bir koleksiyona yeni bir nesne eklemek için POST kullanın - yani yeni bir nesne oluşturun

  • POST, diğer fiillerden hiçbiri tam olarak uymadığında da kullanılır, çünkü HTTP spec onu "veri işleme" fiili olarak tanımlar.

  • Ekibiniz POST'a kapanıyorsa, tüm WWW’nin GET ve POST üzerine kurulduğunu unutmayın;)

Bu yüzden REST ve CRUD arasında benzerlik olsa da, çoğu takımın yaptığı hata iki taraf arasında bir denklik oluşturmak. Bir REST API tanımlarken, CRUD anımsatıcısına fazla takılmamak için bir ekibin gerçekten dikkatli olması gerekir, çünkü bir uygulama olarak REST, CRUD ile temiz bir şekilde eşleşmeyen çok fazla karmaşıklığa sahiptir.


7

CRUD veri okuma ve yazma için en az temel depolama fiilini belirtir: oluştur, oku, güncelle ve sil. Sonra bunları birleştirerek başka işlemler yapabilirsiniz. Bunlar genellikle veritabanı işlemleri olarak kabul edilir, ancak bir veritabanı olarak kabul edilenler keyfidir (örneğin ilişkisel bir DBMS olabilir, fakat aynı zamanda YAML dosyaları da olabilir).

REST, genellikle bazı "kaynaklar" kavramı üzerinde gerçekleştirilecek, genellikle CRUD işlemlerini ve diğer, daha üst düzey işlemleri içeren "mimari bir stil" dir (ancak bunlar uygulamanızda var olanlardır). REST, onu ilginç kılan bir takım kısıtlamalara sahiptir (ve özellikle HTTP ile iyi bir şekilde eşleştirilmiştir).

Bir REST arayüzü, tüm CRUD işlemlerini belirli bir kaynak üzerinde gösterebilir, ancak yapmak zorunda değildir. Bir REST arayüzünde mevcut olan şey isteğe bağlıdır ve sistem izinleri, kullanıcı arayüzü ile ilgili konular ve arayüzün tasarlandığı ve yaratıldığı gün ne kadar sıcak olduğu nedeniyle değişebilir. Sıcak günler, tersi doğru olsa da, genellikle daha minimalist arayüzlere neden olur.


Sağol Yar. Görünüşe göre "Her şey CRUD mu ve daha fazlası mı?" Evet, REST'in teknik özelliği ile veri tabanındaki kayıtlardan daha fazlası için geçerlidir.
Jesse Black

@Maudicus Cevabı güncelledim, ancak daha açık olmak gerekirse: yapması gerekmiyor.
Dan Rosenstark

Başvurunuzun eksiksiz olarak kabul edilmesi için gerekli olduklarını söyleyemem. Bazı uygulamaların doğası gereği eklere, kaldırmaya veya güncellemeye gerek yoktur.
Yam Marcovic

@ Marco Marcovic, tamam, düzeltilmiş
Dan Rosenstark

6

REZİL

  • CRUD dört temel SQL komutu türüdür: Yarat, Oku, Güncelle ve Sil
  • Çoğu uygulamada bir tür CRUD işlevi vardır
  • Bir CRUD uygulaması, veriyi bir veritabanına veri girmek ve çıkarmak için kullanılan formlardan biridir.

DİNLENME

  • REST, Temsili Durum Transferi anlamına gelir (Bazen "ReST" yazıldığından)

  • Vatansız, istemci-sunucu, önbelleklenebilir iletişim protokolüne güveniyor - ve neredeyse her durumda, HTTP protokolü kullanılıyor

  • REST, ağ uygulamaları oluşturmak için bir mimari tarzdır


2

REST, göz atabilecekleri makineler için bir web sayfası gibi bir şey iken, CRUD müşterileriyle güçlü bir şekilde birleşmiş olan SOAP gibi bir şeydir. Bunlar ana farklar. Ofc. yüzeyde benzerler, ancak CRUD temel varlık manipülasyonunu tanımlarken, REST herhangi bir uygulamanın arayüzünü tanımlayabilir. REST'in daha fazla 4 HTTP yöntemini kullanabileceği bir başka fark var. Eğer tüm farklılıkları toplamak istersem çok uzun bir cevap olurdu, REST-SOAP hakkındaki soruları kontrol ederseniz, bunların çoğunu bulacaksınız.

REST'in CRUD ile karıştırılmasının çok yaygın bir hata olduğunu düşünüyorum ve bunun nedeni geliştiricilerin REST hakkında derinlemesine okumaya vakti bulunmadığıdır. Sadece teknolojiyi - anlamadan - benzer geliştiriciler tarafından yazılmış sınırlı CRUD tarzı örneklere dayanarak kullanmak istiyorlar. Örneklerin ve öğreticilerin büyük çoğunluğu ciddi bilgi eksikliğini yansıtıyor. REST kaynaklarını varlıklara eşleştirmek ve HTTP varlıklarını bu varlıkların CRUD işlemlerine eşleştirmek ve REST'i köprüler olmadan kullanmak bunun sadece bir belirtisidir. REST ile işlemlerinizi (POST / PUT / DELETE / PATCH yöntemleriyle bağlantılar dahil) işlemlerinizle eşleştirir ve (genellikle API'ye özgü) bağlantı ilişkisini kontrol ederek istemci tarafındaki işlemi belirlersiniz. Bir REST istemcisi bir bağlantı ilişkisinin ne olduğunu bilmiyorsa ve yalnızca HTTP yöntemlerini ve belki de bazı URI şablonlarını bilirse, o zaman bu bir REST istemcisi değil, HTTP istemcisindeki bir CRUD'dir. Bir REST istemcisinin sık karşılaşılan bir başka yanı, tarayıcıda çalışan tek sayfa bir javascript uygulamasıdır. Elbette böyle bir müşteriyi uygulayabilirsiniz, ancak REST temel olarak otomatik istemciler (bilmediğiniz geliştiriciler tarafından yazılmış sunucu tarafı uygulamaları) ve manüel istemciler (sizin tarafınızdan yazılan kullanıcı kontrollü tarayıcı uygulamaları) içindir. Yalnızca tek bir tarayıcı müşterisine sahip olmak, REST'e gerçekten ihtiyacınız olmadığını ve projeyi yenilediğinizi belirten bir işaret olabilir. Bu durumlarda, bir CRUD API uygulanabilir bir çözümdür ve geliştiriciler bu CRUD API'lerini REST olarak adlandırırlar çünkü farkı bilmiyorlar. Elbette böyle bir müşteriyi uygulayabilirsiniz, ancak REST temel olarak otomatik istemciler (bilmediğiniz geliştiriciler tarafından yazılmış sunucu tarafı uygulamaları) ve manüel istemciler (sizin tarafınızdan yazılan kullanıcı kontrollü tarayıcı uygulamaları) içindir. Yalnızca tek bir tarayıcı müşterisine sahip olmak, REST'e gerçekten ihtiyacınız olmadığını ve projeyi yenilediğinizi belirten bir işaret olabilir. Bu durumlarda, bir CRUD API uygulanabilir bir çözümdür ve geliştiriciler bu CRUD API'lerini REST olarak adlandırırlar çünkü farkı bilmiyorlar. Elbette böyle bir müşteriyi uygulayabilirsiniz, ancak REST temel olarak otomatik istemciler (bilmediğiniz geliştiriciler tarafından yazılmış sunucu tarafı uygulamaları) ve manüel istemciler (sizin tarafınızdan yazılan kullanıcı kontrollü tarayıcı uygulamaları) içindir. Yalnızca tek bir tarayıcı müşterisine sahip olmak, REST'e gerçekten ihtiyacınız olmadığını ve projeyi yenilediğinizi belirten bir işaret olabilir. Bu durumlarda, bir CRUD API uygulanabilir bir çözümdür ve geliştiriciler bu CRUD API'lerini REST olarak adlandırırlar çünkü farkı bilmiyorlar.

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.