Özel HTTP yöntemlerini uygulamada herhangi bir sorun var mı?


34

Aşağıdaki biçimde bir URL’miz var

/ Örnek / {instancetype} / {InstanceID}

Standart HTTP yöntemleriyle arayabilirsiniz: POST, GET, DELETE, PUT. Ancak, "Taslak olarak kaydet" veya "Curate" gibi gerçekleştirdiğimiz birkaç işlem daha var.

DRAFT, VALIDATE, CURATE gibi özel HTTP yöntemlerini kullanabileceğimizi düşündük.

Bence standartlar bu yana kabul edilebilir.

"HTTP / 1.1 için ortak yöntemler kümesi aşağıda tanımlanmıştır. Bu kümenin genişletilebilmesine rağmen, ayrı bir şekilde genişletilmiş istemciler ve sunucular için aynı semantiği paylaşmak için ek yöntemler kullanılamaz."

WebDav gibi araçlar da kendi uzantılarını oluşturur.

Birinin özel yöntemlerle karşılaştığı sorunlar var mı? Proxy sunucularını ve güvenlik duvarlarını düşünüyorum; Güvenli tarafta kalmalı mıyım ve sadece action = validate | curate | draft gibi bir URL parametresine sahip olmalı mıyım?


6
RFC 1925'ten tekrar alıntı yaptığım gibi - "Protokol tasarımında, ekleyecek hiçbir şey kalmadığında değil, elimden alınacak hiçbir şey kalmadığında mükemmelliğe ulaşıldı." - Çalışırsa, http'e eklemek için hiçbir neden yoktur.

4
Artık yanlış bir şey değil, şu an HTTP'yi değil de özel bir protokol kullandığınızı fark ettiğiniz sürece.
user16764

10
@ user16764 "HTTP / 1.1 için ortak yöntemler kümesi aşağıda tanımlanmıştır. Bu kümenin genişletilebilmesine rağmen, aynı semantiği ayrı olarak genişletilmiş istemciler ve sunucular için paylaşmanın başka yöntemleri de varsayılamaz." w3.org/Protocols/rfc2616/rfc2616-sec9.html Bu nedenle izin verilir ve hala HTTP'dir
Juan Mendes

imho'yu eklemek / kaldırmak için hiçbir şey yok, çünkü yöntem tanımları özel yöntemlerin kullanılmasının HTTP / 1.1 kapsamında zaten kabul edilebilir olduğunu ancak aynı semantiği paylaşmasının beklenemeyeceğini belirtiyor. biraz
yatıştırılmış olun

Yanıtlar:


42

HTTP temel kısıtlar ve biri REST merkez tasarım özelliği bir olan tek tip arayüz (diğer şeylerin yanı sıra) tarafından sağlanan tüm kaynaklara evrensel geçerli yöntemlerin küçük ve sabit seti. Düzgün ara yüz kısıtlaması bir çok alt ve üst kısma sahiptir. Burada Fielding’ten liberal olarak alıntı yapıyorum .

Tek tip bir arayüz:

  • daha basittir.
  • sundukları hizmetlerden uygulamaları ayırır.
  • HTTP yük dengeleyici (nginx) ve önbellek (cila) gibi şeyler de dahil olmak üzere katmanlı bir mimariye izin verir.

Öte yandan, tek tip bir arayüz:

  • Verimliliği düşürür, çünkü bilgiler bir uygulamanın gereksinimlerine özgü olandan ziyade standart bir biçimde aktarılır.

Geçişler "Web'in ortak durumu için tasarlandı" ve web mimarilerindeki yaygın sorunların çoğuna çözümler sunan büyük bir ekosistemin kurulmasına izin verdi. Düzgün bir ara yüze yapıştırmak, sisteminizin bu ekosistemden faydalanmasına izin verirken, onu zorlaştırır. Nginx gibi bir yük dengeleyici kullanmak isteyebilirsiniz, fakat şimdi sadece DRAFT ve CURATE'i anlayan bir yük dengeleyici kullanabilirsiniz. Varnish gibi bir HTTP önbellek katmanı kullanmak isteyebilirsiniz, ancak şimdi yalnızca DRAFT ve CURATE'i anlayan bir HTTP önbellek katmanı kullanabilirsiniz. Bir sunucu arızasında sorun giderme konusunda yardım istemek isteyebilirsiniz, ancak hiç kimse bir CURATE isteğinin anlamını bilmiyor. Yeni yöntemleri anlamak ve doğru şekilde uygulamak için tercih ettiğiniz istemci veya sunucu kitaplıklarını değiştirmek zor olabilir. Ve bunun gibi.

Bunu göstermenin doğru * yolu , kaynak (veya ilgili kaynaklar) üzerindeki bir devlet dönüşümüdür . Bir yazıyı ÇEKİRMEZ, draftdurumunu dönüştürür trueveya draftönceki taslak sürümlerinde yapılan değişiklikleri ve bağlantıları içeren bir kaynak yaratırsınız. Bir gönderiyi KÜRATMAYIN, curateddurumunu dönüştürür trueveya gönderiyi curationküratörlüğünü yapan kullanıcıya bağlayan bir kaynak yaratırsınız .

* REST mimari ilkelerini en yakından takip ettiği için doğru.


Yük dengeleme hakkındaki yorumlarınız için teşekkürler, kesinlikle buna göz atacağım. Özel yöntemlerin kabul edilebilir olup olmadığını belirten bir kaynak biliyor musunuz?
Juan Mendes,

2
WEBDAV gibi yaygın olarak desteklenen bir uzantının parçası olmadıkça (ve o zaman bile o kadar da değil) özel yöntemlerde hiçbir avantaj göremiyorum, bu yüzden hiç araştırmamıştım. Ben sadece bu değişikliklere durum dönüşümü olarak davranmanızı tavsiye ederim. Web zaten sahip olduğumuz yöntemlerle gayet iyi çalışıyor. Üniforma arabiriminin bir parçası olarak mantıklı olmadığı sürece daha fazlasını eklemek için gerçekten iyi bir neden yoktur (PATCH gibi).
Rein Henrich,

5
HTTP servisinizin sizin için çalışmasını istediğiniz şekilde tasarlamanın avantajını görüyorum. bununla birlikte, "aynı semantikleri paylaşmaları için ek yöntemler kabul edilemez" - Yeterince adil, ANCAK hala HTTP / 1.1 kapsamının bir parçası, bu nedenle güvenlik duvarları, proxy'ler, yük dengeleyiciler ve benzerleri buna izin vermeli, t HTTP / 1.1'i düzgün uygulamıyorlar mı?
Prof83 9

Muhtemelen kalan POV'dan haklısın, ancak, özel fiillerin neden bir sorun olması gerektiğini anlamıyorum. Tüm araçlar onlara POST gibi davranmalı, yani “kaynak muhtemelen değişiyor ve tek bildiğimiz bu”.
maaartinus

7

Bunları, POST isteğinde bulunduğunuz alt kaynaklar olarak tasarlamayı tercih ederim.

Eğer bir kaynak var düşünün /instance/type/1gibi kaynakta yapılabilir 'eylemleri' ile bağlantılarından bir çift iletmek O kaynağın temsil olurdu, /instance/type/1/draftve /instance/type/1/curate. JSON'da, bu kadar basit olabilir:

{
    "some property":"the usual value",
    "state": "we can still inform the client about the current state",
    "draft": "http://server/instance/type/1/draft",
    "curate": "http://server/instance/type/1/curate"
}

Bu, müşterinin ne olması gerektiği konusunda POST talebi sırasında curateüye tarafından sağlanan bağlantıya çok açık olmasını sağlar . Buraya gönderilen kaynak olayı, belki bir devlet geçişi yaratacak olan detaylandırmayı içeren argümanlar içerebilir.

Bir kaynak üzerindeki muhtemel durumlar arasında hareket etmenin 'saf' yaklaşımı ile devam etmek, olayların bu geçişlere neden olanı yakalamamasının dezavantajıdır.

Devlet geçişleri genellikle belirli olaylara cevap olarak gerçekleşir ve müşterinin şu anda belirli bir 'durumda' olduğuna karar vermesine izin vermek yerine bu olayları yakalamayı tercih ederim. Aynı zamanda doğrulama çok daha zorlaştırır. Ayrıca, devletin içindekileri de tanımlamazsanız, herhangi bir 'argüman' yakalayamazsınız. Ve sonra, bazı kodlar gerçek durum geçişi olmayanları değiştirdiğinde ve gerekli doğrulama yapıldığında her şey karışır ve her şey çabucak bir karışıklık haline gelir.


İyi cevap. Durum geçişlerine argümanlar sunabilmek ve sunucunun bunları kapsıp yönetmesini sağlamak en iyi yaklaşımdır.
Thomas W

Şu anda bulunduğum şirket (VMware) bunu yapıyor. Bir GET, /vms/some-idgibi eylemlere giden bağlantıları döndürür POST /vms/some-id/restartve eylemlerin etkinleştirilmesi veya devre dışı bırakılması gerekip gerekmediğini belirlemek için kullanırız. HATEOAS ile aşk / nefret ilişkim var :)
Juan Mendes

Gerçekleştirilen eylemin, rastgele bir sorgu parametresi, kaynak yolu segmenti veya gövde özelliğine karşı isteğinin fiili olması çok daha anlamlı olurdu.
Matthew Whited

Bir fiile bağlanamazsınız.
Dave Van den Eynde

6

Özel HTTP yönteminin varlık eylemlerini uygulamanın en iyi yolu olduğunu düşünüyorum. Eylemi varlık kuruluşuna (POST) eklemek doğru görünmüyor, varlığınızın bir parçası değil (sonuç içinde kaydedilmiş olsa da). Ayrıca, özel HTTP yöntemlerini kullanmak proxy sunucuları, varlık gövdesini ayrıştırmaya gerek kalmadan eylemlerini belirleyebilir.

CRUD'a benziyor, her zaman bunları uygulamak istersiniz, ancak aynı zamanda kendi eylemleriniz de vardır (enitite başına). Bunları genişletmenin sorunun ne olacağını gerçekten anlamıyorum.

Ayrıca @Rein Henrichs "Bir yazıyı ÇEKİRDİNİZ, taslak durumunu gerçeğe dönüştürürsünüz ya da bir taslak kaynak yaratırsınız" bana yanlış geliyor. Bir draftsözellik, devleti kurtarmak için değil dönüşüm yapmak için kullanılacaktır. Eylemler mutlaka bir 'devlete' yol açmaz, hatta bir mülke kaydedilmez. Her bir durum / dönüşüm için ayrı bir varlık yaratılması daha da bulanık gözüküyor .. aynı referansı (URI) enity'ye tutmaya çalışın.


1
Bu geniş çapta aynı fikirde olmasa da adil bir nokta, arkasındaki nedenleri görebiliyorum ve olumsuz oyuna katılmıyorum (özellikle seçmenden hiçbir yorum yapmadan). Örnek olarak PHP istisna muamelesini ele alalım, "En İyi Uygulama", RuntimeException ve BadMethodCallException gibi gerçek mesajları bile yok sayarak, istisna türünü önermek için özel İstisna türlerini kullanmaya meyilli görünüyor. Öyleyse neden özel yöntemler kullanmak zaten HTTP / 1.1 kapsamının bir parçası olarak kabul ediliyorsa, DRAFT kullanımına karşı neden bu kadar yaygın bir şekilde tartışılıyor? Yük dengeleyiciler ve vekiller de bu olasılığı gerçekten kabul etmelidir
Prof83
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.