Bir REST API, komut / eylem tabanlı bir etki alanına nasıl uyar?


24

Bu yazımda yazar

Bazen, API’de kendiliğinden RESTful olmayan bir işlemi göstermek gerekebilir.

ve şu

Bir API çok fazla eylem içeriyorsa, bu, RESTful ilkeleri kullanmak yerine bir RPC bakış açısı ile tasarlandığını veya söz konusu API'nin bir RPC türü model için doğal olarak daha uygun olduğunu gösterir.

Bu, başka yerlerde de okuduğum ve duyduğum şeyleri yansıtıyor.

Ancak bunu oldukça kafa karıştırıcı buluyorum ve konuyu daha iyi anlamak istiyorum.

Örnek I: Bir VM'yi bir REST arayüzü ile kapatmak

Bir VM'nin kapatılmasını modellemenin temelde farklı iki yolu olduğunu düşünüyorum. Her yolun bir kaç farklılığı olabilir, fakat şu an için en temel farklılıklara odaklanalım.

1. Kaynağın state özelliğini yama

PATCH /api/virtualmachines/42
Content-Type:application/json  

{ "state": "shutting down" }

(Alternatif olarak, PUTalt kaynakta /api/virtualmachines/42/state.)

VM arka planda kapatılacak ve kapatmanın kapatılıp kapatılmayacağına bağlı olarak daha sonra bir noktada başarılı olamayacak veya devlet "güç kapalı" durumuyla dahili olarak güncellenebilir.

2. Kaynağın actions özelliğine PUT veya POST

PUT /api/virtualmachines/42/actions
Content-Type:application/json  

{ "type": "shutdown" }

Sonuç, ilk örnekteki ile tamamen aynıdır. Devlet derhal "kapanma" ve belki de "kapanma" olarak güncellenecektir.

Her iki tasarım da RESTful mı?

Hangi tasarım daha iyi?

Örnek II: CQRS

Peki ya potansiyel olarak birden fazla topluluğun güncelleştirilmesine yol açabilecek ya da somut kaynaklar ve alt kaynaklar üzerindeki CRUD işlemleriyle eşlenemeyen birçok "eylem" (aka komutu) içeren bir CQRS alanımız varsa?

Mümkün olan yerlerde (örnek I'deki ilk yaklaşımı takip ederek) somut kaynaklar üzerinde somut olarak oluşturduğu veya güncellediği kadar komut vermeyi denemeli ve geri kalanı için "eylem bitiş noktaları" kullanmalı mıyız?

Yoksa tüm komutları eylem bitiş noktalarıyla eşleştirmeli miyiz (örnek I'in ikinci yaklaşımında olduğu gibi)?

Çizgiyi nereye çekmeliyiz? Tasarım ne zaman daha az RESTful olur?

CQRS modeli, API benzeri bir RPC için daha uygun mu?

Yukarıda alıntı metne göre, anladığım gibi.

Benim birçok sorudan görebileceğiniz gibi, bu konuda biraz kafam karıştı. Bunu daha iyi anlayabilmeme yardım eder misin?


"Bir eylem oluşturma", yürütülen eylemin daha sonra kendi kaynak tanımlayıcısına sahip olması dışında, RESTful görünmüyor. Aksi takdirde, "state" özelliğini PATCH veya PUT ile değiştirmek daha mantıklı olur. CQRS bölümü için henüz iyi bir cevabım yok.
Fabian Schmengler

3
@Laiv Bunda yanlış bir şey yok. Bu akademik bir soru, konuyu daha derinlemesine anlamak istiyorum.
leifbattermann,

Yanıtlar:


19

İlk durumda (VM'lerin kapatılması), OP alternatiflerinin hiçbirini RESTful olarak düşünmedim. Kabul edilirse, Richardson olgunluk modelini kıstas olarak kullanırsanız, her ikisi de kaynak ve fiiller kullandıkları için iki API'dir .

Yine de ikisi de hypermedia kontrollerini kullanmıyorlar ve bence RESTful API tasarımını RPC'den ayıran tek REST türüdür . Başka bir deyişle, seviye 1 ve 2'ye bağlı kaldığınızda çoğu durumda RPC tarzı bir API'niz olur.

Bir VM'yi kapatmanın iki farklı yolunu modellemek için VM'yi (diğer şeylerin yanı sıra) bağlantılar içeren bir kaynak olarak ortaya koyarım:

{
    "links": [{
        "rel": "shut-down",
        "href": "/vms/1234/fdaIX"
    }, {
        "rel": "power-off",
        "href": "/vms/1234/CHTY91"
    }],
    "name": "Ploeh",
    "started": "2016-08-21T12:34:23Z"
}

Bir müşteri PloehVM'yi kapatmak isterse , ilişki türü ile bağlantıyı takip etmelidirshut-down . (Normalde, RESTful Web Services Yemek Kitabında belirtildiği gibi, ilişki türleri için bir IRI veya daha ayrıntılı bir tanımlama şeması kullanırsınız, ancak örneği olabildiğince basit tutmayı seçtim.)

Bu durumda, işlemle ilgili başka çok az bilgi vardır; bu nedenle, müşteri aşağıdaki adreste bulunan URL'ye karşı boş bir POST yapmalıdır href:

POST /vms/1234/fdaIX HTTP/1.1

(Bu isteğin bir gövdesi olmadığından, bunu bir GET isteği olarak modellemek cazip gelebilir, ancak GET isteklerinin gözlenebilir hiçbir yan etkisi olmamalıdır, bu yüzden POST daha doğrudur.)

Aynı şekilde, bir müşteri VM'yi kapatmak istiyorsa, power-offbağlantıyı izleyecektir .

Başka bir deyişle, bağlantıların ilişki türleri sağlamak kazanımları niyet göstermektedir. Her ilişki türünün belirli bir anlamsal önemi vardır. Bazen anlamsal ağ hakkında konuşmamızın nedeni budur .

Örneği mümkün olduğunca açık tutmak için, her bağlantıdaki URL’leri kasıtlı olarak gizledim. Barındıran sunucu gelen isteği aldığında, bilirdin fdaIXaraçlarının kapatıldı ve CHTY91araçlar kapatma .

Normal olarak, URL’deki eylemi kodladım, böylece URL’ler olacaktı /vms/1234/shut-downve /vms/1234/power-offancak öğretirken, ilişki türleri (anlambilimsel) ve URL’ler arasındaki farkı bulanıklaştırıyor (uygulama ayrıntıları).

Hangi müşterilere sahip olduğunuza bağlı olarak, RESTful URL’leri kesilemez hale getirebilirsiniz .

CQRS

CQRS'ye gelince, Greg Young ve Udi Dahan'ın kabul ettiği birkaç şeyden biri, CQRS'nin üst düzey bir mimari olmadığıdır . Bu nedenle, CQRS benzeri RESTful API yapma konusunda temkinli olurum, çünkü bu müşterilerinizin mimarinizin bir parçası olduğu anlamına gelir.

Genellikle, gerçekte gerçekte (seviye 3) RESTful API'nin itici gücü, müşterileri bozmadan ve müşterileri kontrol etmeden API'nizi geliştirebilmenizdir. Motivasyonun buysa, ilk tercihim CQRS olmazdı.


İlk örneklerin ikisinin de RESTful olmadığını mı demek istiyorsunuz? Ancak herhangi bir yanıt bile göndermedim, yalnızca istek URL'lerini ve kuruluşlarını.
leifbattermann,

4
@leifbattermann RESTful değiller, çünkü mesaj iletisini niyetini iletmek için kullanıyorlar; bu açıkça RPC. Bu kaynaklara ulaşmak için linkler kullandıysanız, neden kuruluş aracılığıyla niyet iletişim kurmanız gerekiyor?
Mark Seemann

Bu mantıklı. Neden bir POST öneriyorsun? Eylem önemsiz değil mi? Her durumda, müşterinize hangi HTTP yöntemini kullanacağınızı nasıl söylersiniz?
leifbattermann,

2
@ guillaume31 DELETEbana tuhaf geliyor çünkü kapattıktan sonra vm hala var olacak, sadece "kapanma" durumunda (veya bunun gibi).
leifbattermann,

1
Kaynak, sanal olarak bir VM'yi yansıtmak zorunda değildir, bunun bir yürütme örneğini temsil edebilir.
guillaume31

6

Bir VM'yi REST arayüzü ile kapatma

Bu aslında 2009 yılında Tim Bray tarafından ortaya konan bir nevi ünlü örnek .

Roy Fielding, sorunu tartışırken, bu gözlemi paylaştı :

Şahsen ben izlenen durumu (güç durumu gibi) düzenlenebilir olarak görmeyen sistemleri tercih ediyorum.

Kısacası, izlenen durumun güncel bir temsilini döndüren bir bilgi kaynağınız var; Bu gösterim , bu durumda bir değişiklik istemek için bir forma bir hiper medya bağlantısı içerebilir ve formun (her biri) değişiklik isteğini işlemek için bir kaynağa başka bir bağlantısı vardır.

Seth Ladd problemle ilgili önemli görüşler edindi

Koşma, bir insanın basit durumundan yaratılabilir, güncellenebilir ve konuşulabilecek gerçek bir isme dönüştük.

Makineyi yeniden başlatmaya geri götürmek. Sana POST olacağını iddia ediyorum / VDC / 434 / küme / 4894 / sunucu / 4343 / yeniden başlatma Yayınladığınız sonra, temsil eden bir URI var bu yeniden başlatma ve durum güncellemeleri için GET olabilir. Köprü kurmanın büyüsü ile, Yeniden Başlat'ın temsili yeniden başlatılan Sunucuya bağlanır.

Bence URI alanını küçültmek ucuz ve URI'lar daha da ucuz. İsim olarak modellenmiş bir aktivite koleksiyonu oluşturun ve POST, PUT ve DELETE uzakta!

RESTful programlama web ölçeğinde Vogon bürokrasisidir. RESTful bir şeyi nasıl yaparsın ? Bunun için yeni evrak icat et ve evrakı dijitalleştir.

Biraz merak uyandıran dilde, yaptığınız şey "VM'yi kapatma" etki alanı uygulama protokolünü tanımlamak ve bu protokolü göstermeniz / uygulamanız için gereken kaynakları belirlemek.

Kendi örneklerine bakmak

PATCH /api/virtualmachines/42
Content-Type:application/json  

{ "state": "shutting down" }

Bu iyi; gerçekten isteğin kendisine ayrı bir bilgi kaynağı olarak bakmıyorsunuz, ancak yine de başarabiliyorsunuz.

Değişimi temsil ettiğinizde biraz özlediniz.

Bununla birlikte PATCH ile, ekteki varlık, yeni bir sürüm üretmek için o anda sunucuda bulunan bir kaynağın nasıl değiştirilebileceğini açıklayan bir dizi talimat içerir.

Örneğin, JSON Patch ortam türü, bir JSON belgesini doğrudan değiştiriyormuşçasına talimatları biçimlendirir

[
    { "op": "replace", "path": "state", "value": "shutting down" }
]

Alternatifinde, fikir yakın, ama açıkçası doğru değil. hedef URL'dekiPUT kaynağın durumunun tamamen değiştirilmesidir , bu nedenle muhtemelen tek bir varlığın temsilinin hedefi olarak bir koleksiyona benzeyen bir yazım denetimi yapmazsınız.

POST /api/virtualmachines/42/actions

Kuyruğa bir eylem eklediğimiz kurguyla tutarlı.

PUT /api/virtualmachines/42/latestAction

Sıradaki kuyruk öğesinde güncelleme yaptığımız kurguyla tutarlı; bu şekilde yapmak biraz garip. En küçük sürpriz ilkesi, her PUT'a, hepsini bir yere koymak ve aynı anda birden fazla kaynağı değiştirmek yerine, kendi benzersiz tanımlayıcısını vermeyi önerir.

URI'nin yazılışını tartıştığımız sürece, REST'in umrunda olmadığını; /cc719e3a-c772-48ee-b0e6-09b4e7abbf8b, REST ile ilgili olarak mükemmel bir renk URI'sıdır. Okunabilirlik, değişken isimlerinde olduğu gibi ayrı bir husustur. RFC 3986 ile tutarlı olan yazım kurallarının kullanılması insanları daha mutlu edecektir .

CQRS

Peki ya potansiyel olarak birden fazla topluluğun güncelleştirilmesine yol açabilecek ya da somut kaynaklar ve alt kaynaklar üzerindeki CRUD işlemleriyle eşlenemeyen birçok "eylem" (aka komutu) içeren bir CQRS alanımız varsa?

Greg Young CQRS'de

CQRS, mimarisi için aksi takdirde bulunmayan birçok fırsatı sağlayan çok basit bir kalıptır. CQRS nihai tutarlılık değildir, olay değildir, mesajlaşma değildir, okuma ve yazma için ayrılmış modellere sahip değildir ve olay kaynağını kullanmaz.

Çoğu kişi CQRS hakkında konuştuğunda, gerçekten CQRS modelini uygulamanın hizmet sınırını temsil eden nesneye uygulama hakkında konuşuyorlar.

CQRS hakkında HTTP / REST bağlamında konuştuğunuz göz önüne alındığında, bu ikinci bağlamda çalıştığınızı varsaymanız makul gözükmektedir, bu yüzden devam edelim.

Bu, şaşırtıcı bir şekilde, önceki örneğinizden bile daha kolaydır. Bunun nedeni basittir: komutlar mesajlardır .

Jim Webber , HTTP’yi 1950’lerin ofisinin uygulama protokolü olarak tanımlar; iş mesajlar alıp gelen kutularına koyarak yapılır. Aynı fikir geçerli - bir formun boş bir kopyasını alıyoruz, bildiğimiz detayları doldurup teslim ediyoruz. Ta da

Mümkün olan yerlerde (örnek I'deki ilk yaklaşımı takip ederek) somut kaynaklar üzerinde somut olarak oluşturduğu veya güncellediği kadar komut vermeyi denemeli ve geri kalanı için "eylem bitiş noktaları" kullanmalı mıyız?

Evet, “somut kaynaklar” olduğu sürece, etki alanı modelindeki varlıklar yerine mesajlardır.

Anahtar fikir: REST API'niz hala bir arayüzdür ; istemcilerin mesajları değiştirmeye gerek kalmadan temel modeli değiştirebilmeniz gerekir. Yeni bir model yayınladığınızda, etki alanı protokolünüzü nasıl alacağınızı ve yeni modele nasıl uygulayacağınızı bilen web uç noktalarınızın yeni bir sürümünü yayınlarsınız.

CQRS modeli, API benzeri bir RPC için daha uygun mu?

Gerçekten değil - özellikle, web önbellekleri "sonunda tutarlı bir okuma modelinin" harika bir örneğidir. Her bir görüşünüzü bağımsız olarak adreslenebilir kılmak, her birinin kendi önbelleğe alma kuralları vardır, size ücretsiz olarak bir sürü ölçeklendirme sağlar. Okumak için sadece bir RPC yaklaşımına nispeten az itiraz var.

Yazma için, kandırıcı bir soru: tüm komutları tek bir uç noktadaki veya tek bir uç nokta ailesindeki tek bir işleyiciye göndermek kesinlikle daha kolaydır . REST, son noktanın müşteriye nerede iletişim kurduğu ile ilgili gerçekten daha fazla.

Bir mesajı kendi benzersiz kaynağı olarak ele almak, PUT'yi kullanabilme avantajına sahiptir, ara bileşenlerini mesajın kullanılmasının önemsiz olduğunu ve belirli hata işleme durumlarına katılabilmeleri konusunda uyarıda bulunur. . (Not: müşterilerin bakış açısından, eğer kaynaklar farklı URI'lar varsa, o zaman farklı kaynaklar olurlar; hepsinin, kaynak sunucuda aynı istek işleyici koduna sahip olmaları, üniforma tarafından gizlenen bir uygulama detayıdır. arayüz).

Fielding (2008)

Ayrıca, yukarıdakilerin henüz tamamen RESTful olmadığını, en azından bu terimi nasıl kullandığımı da not etmeliyim. Tek yaptığım, herhangi bir RPC'den daha fazla olmayan servis arayüzleri. RESTful yapmak için, hizmeti tanıtmak ve tanımlamak, formları ve / veya bağlantı şablonlarını kullanarak eşleştirmeyi nasıl gerçekleştireceğimi ve görselleştirmeleri faydalı şekillerde birleştirmek için kod sağlamak için köprü metni eklemem gerekecek.


2

İsteğin içerik türü başlık alanındaki komutu belirlemek için 5 ortam türü düzeyinden yararlanabilirsiniz .

VM örneğinde, bu satırlar boyunca bir şey olurdu

PUT /api/virtualmachines/42
Content-Type:application/json;domain-model=PowerOnVm

> HTTP/1.1 201 Created
Location: /api/virtualmachines/42/instance

Sonra

DELETE /api/virtualmachines/42/instance
Content-Type:application/json;domain-model=ShutDownVm

Veya

DELETE /api/virtualmachines/42/instance
Content-Type:application/json;domain-model=PowerOffVm

Bkz https://www.infoq.com/articles/rest-api-on-cqrs


Tavsiye edilmeli, 5LMT önerilen bir çözümdü ve standartlarla desteklenmiyor . Daha önce CQRS makalesine rastladım ve bundan çok şey öğrendim.
Peter L,

1

Bağlantılı makaledeki örnek, makineyi çalıştırmanın ve kapatmanın, modellenmiş kaynakların durumundaki değişiklikler yerine komutlarla yönlendirilmesi gerektiği fikrine dayanır. İkincisi, REST'in yaşadığı ve nefes aldığı şeydir. Sanal Makinenin daha iyi modellenmesi, gerçek dünyadaki meslektaşıların nasıl çalıştığına ve sizin bir insan olarak, onunla nasıl etkileşime gireceğine bir göz atmanızı gerektirir. Bu uzun soluklu, ama bence iyi modelleme yapmak için gereken düşünce türüne dair iyi bir fikir veriyor.

Masanın üzerindeki bilgisayarın güç durumunu kontrol etmenin iki yolu var:

  • Güç Düğmesi: Tüm bilgisayarı ani, düzensiz bir şekilde durduracak şekilde, elektrik kaynağını derhal keser.
  • Açma / Kapama Düğmesi: Donanıma, yazılımı dışardan bir şeyin her şeyin kapatılmasını istediğini bildirmesini söyler. Yazılım düzenli bir şekilde kapanıyor, yaptığı donanıma haber veriyor ve donanım, güç kaynağını bekleme durumuna geçebileceğini gösteriyor. Güç düğmesi açıksa, makine çalışıyor ve yazılım kapatma sinyaline yanıt veremediği bir durumda ise, güç düğmesini kapatmazsam sistem kapanmaz. (Bir VM tam olarak aynı şekilde davranacaktır; eğer kapatma sinyali yazılım tarafından görmezden gelinirse, makine çalışmaya devam edecektir. Cihazı kapatmak için zorlamalıyım.) Makineyi yeniden başlatabilmek istersem, güç düğmesini tekrar açın ve ardından açma / kapama düğmesine basın. (Çoğu bilgisayarda, doğrudan bekleme durumuna geçmek için güç düğmesine uzun süre basma seçeneği vardır, ancak bu model buna gerçekten ihtiyaç duymuyor.) Bu düğme bir geçiş anahtarı gibi ele alınabilir çünkü bu tuşa basıldığında, duruma bağlı olarak farklı davranışlar ortaya çıkar. Güç düğmesi kapalıysa, bu düğmeye basmak kesinlikle hiçbir şey yapmaz.

Bir VM için bunların her ikisi de Boolean değerleri okuma / yazma olarak modellenebilir:

  • power- Değiştirildiğinde true, anahtarın bu duruma alındığına dair bir notun dışında hiçbir şey olmuyor. Olarak değiştirildiğinde false, VM derhal kapanma durumuna çevrilir. Tamamlanma adına, değer yazmadan sonra değişmezse, hiçbir şey olmaz.

  • onoff- değiştirildi zaman trueeğer hiçbir şey olmaz powerise false, aksi VM başlatmak için komut verilir. Olarak değiştirildi zaman falseeğer hiçbir şey olmaz poweredilir false, aksi halde VM o gücün kapalı duruma gidebilirsiniz VM bunu yapacak düzenli bir kapatma yapmak için yazılımı bildirmek ve daha sonra bildirmek için komut verilir. Yine, bütünlük için, değişmeyen bir yazma hiçbir şey yapmaz.

Bütün bunlar, makinenin durumu anahtarların durumunu yansıtmadığında bir durumun olduğunun farkına varma, ve bu kapatma sırasında. powerhala olmayacak trueve onoffolacak false, ancak işlemci hala kapatılıyor ve bunun için makinenin gerçekte ne yaptığını söyleyebilmemiz için başka bir kaynak eklememiz gerekiyor:

  • running- trueSanal makine çalışırken ve çalışmadığı falsezamanlarda, hipervizörden durumu isteyerek belirlenen salt okunur bir değer .

Bunun bir sonucu olarak, bir VM'nin başlatılmasını istiyorsanız, powerve onoffkaynaklarının ayarlandığından emin olmanız gerekir true. (Sen izin verebilir poweradım onu yaparak atlanmasına, kendini-temizleme böylece için set eğer false, o olur trueyapmak için bir restfully-saf bir şey olmadığını VM verifiably sert durduktan sonra. Yem başka tartışma içindir.) Eğer düzenli bir kapatma yapmak istiyorsanız, set onoffiçin falseayar ve makine aslında durdu görmek için daha sonra geri gelmek poweriçin falsedoğru değilse.

Gerçek dünya gibi, hala onoffdeğiştikten sonra VM'yi başlatmaya yönelme probleminiz var falseama bunun runningnedeni hala kapanmanın ortasında olmasıdır. Bununla nasıl başa çıkacağınız bir politika kararıdır.


0

Her iki tasarım da RESTful mı?

Bu yüzden rahat düşünmek istiyorsanız o zaman komutları unutun. İstemci, sunucuya VM'yi kapatmasını söylemez. İstemci "kapanır" (metaforik konuşur), durumunu ve ardından sunucudaki PUT'leri güncelleyerek kaynak gösterimini kopyalar. Sunucu, yeni durum temsilinin ve bunun bir yan etkisi olarak VM'yi kapattığını kabul eder. Yan etki yönü sunucuya bırakılmıştır.

Az

Hey sunucu, buradaki müşteri, VM'yi kapatır mısın lütfen?

ve dahası

Merhaba sunucu, burada müşteri, VM 42 kaynağının durumunu kapatma durumuna güncelledim, bu kaynağın kopyasını güncelledikten sonra uygun olduğunu düşündüğün şeyi yaptım

Sunucunun bu yeni durumu kabul etmesinin yan etkisi olarak, hangi eylemleri gerçekleştirmesi gerektiğini (VM 42'yi fiziksel olarak kapatmak gibi) kontrol edebilir, ancak bu, müşteriye karşı şeffaftır. İstemcinin, sunucunun bu yeni durumla tutarlı olması için gerçekleştirmesi gereken herhangi bir işlemle ilgisi yoktur.

Öyleyse komutları unut. Tek komutlar HTTP'de durum aktarımı için fiillerdir. İstemci, sunucunun fiziksel VM'yi kapatılma durumuna nasıl getireceğini bilmiyor ve umrunda değil. İstemci sunucuya bunu başarması için komutlar vermiyor, sadece yeni durumun bu olduğunu söylüyor .

Bunun gücü, istemciyi sunucudan akış kontrolü açısından ayırmasıdır. Sunucu daha sonra VM'lerle çalışma şeklini değiştirirse, istemci umursamaz. Güncelleştirilecek komut bitiş noktası yok. RPC size API bitiş noktasını değiştirirseniz shutdowniçin shut-downartık sunucuda aramaya komutu bilmiyorum gibi tüm müşterilerinizi kırıldı.

REST, bildirimsel programlamaya benzer, burada bir şeyi değiştirmek için bir dizi talimat listelemek yerine, nasıl olmasını istediğinizi belirtin ve programlama ortamının onu tanımlamasını sağlayın.


Cevabınız için teşekkürler. İstemci ve sunucuyu ayrıştırmanın ikinci kısmı, kendi anlayışımla çok uyumlu. Cevabınızın ilk bölümünü destekleyen bir kaynağınız / bağlantınız var mı? Kaynakları, HTTP yöntemlerini, hypermedia, kendini tanımlayan mesajları vb. Kullanırsam tam olarak hangi REST kısıtlaması bozulur?
leifbattermann

Kaynakların kullanımı, HTTP yöntemleri vb. İle ilgili bir sorun yoktur. Bir sorunun olduğu yerde “eylem bitiş noktaları” olarak adlandırdığınız şeyi kullanıyor. REST'te kavramları veya şeyleri temsil eden kaynaklar (sanal makine 42 veya banka hesabım gibi) vardır ve HTTP fiilleri bu kaynakların durumunu istemciler ve sunucular arasında aktarmak için kullanır. Bu kadar. Yapmamanız gereken, kaynak olmayan uç noktaları HTTP fiilleriyle birleştirerek yeni komutlar oluşturmaya çalışmaktır. Bu yüzden 'virtualmachines / 42 / actions' bir kaynak değildir ve RESTful bir sistemde bulunmamalıdır.
Cormac Mulhall

Ya da başka bir şekilde söylemek gerekirse, müşteri sunucuda komut çalıştırmaya çalışmamalıdır (yalnızca kaynakların aktarılmasıyla ilgili olan sınırlı HTTP fiillerinin ötesinde). İstemci kaynağın kopyasını güncellemeli ve ardından sunucudan bu yeni durumu kabul etmesini istemelidir. Bu yeni durumun kabul edilmesinin yan etkileri olabilir (VM 42, fiziksel olarak kapatılmıştır), ancak bu, müşterinin endişesinin ötesindedir. İstemci sunucuda komut çalıştırmaya çalışmıyorsa, istemci ile sunucu arasında bu komutlarla bağlantı yoktur.
Cormac Mulhall

Komutu kaynakta çalıştırabilirsiniz ... Nasıl bir banka hesabında "para yatır" ve "para çek" diyelim? CRUD olmayan bir şey için CRUD kullanıyor olacaktı.
Konrad

POST /api/virtualmachines/42/shutdownHerhangi bir "yan etkiye" sahip olmak yerine kullanmak daha iyidir . API kullanıcı tarafından anlaşılabilir olmalıdır, örneğin DELETE /api/virtualmachines/42VM'yi durduracağını nasıl bilebilirim ? Benim için bir yan etkisi bir hatadır, API'lerimizi anlaşılabilir ve kendi kendine tanımlayıcı olacak şekilde tasarlamalıyız
Konrad
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.