CRUD dışı işlemleri gerçekleştirmek için bir REST API nasıl tasarlanır?


11

SOĞUK tabanlı hizmetler kümesi RESTful API dönüştürmek çalışıyorum.

İşlem adlarını analiz ederek kaynakları belirleyerek başladım ve kaynağı aldım Subscription.

Aboneliğin durumunu güncellemem POSTgerektiğinde, kaynaklara doğrudan erişemediğim için sunucuya bir istek gönderemiyorum , ancak özelliklerini güncellemek için bazı RPC tarzı işlemleri çağırmam gerekiyor. Ayrıca, yalnızca ve yalnızca aboneliğin durumunu "etkin" olarak değiştirirsem, harici bir hizmete ek bir çağrı yapılması gerekir.

Bu durumlarda, altta yatan operasyonları ele almak için en iyi uygulama nedir?

Ben geldi çözüm sorgu parametreleri kullanmaktır, böylece aktivasyon servisini çağırmak gerekirse, ben gibi bir şey kullanabilirsiniz:

POST /subscriptions/{subscriptionid}/?activate=true

Abonelik nesne alanlarımı doğrudan güncelleyemediğim düşünüldüğünde, bu tür bir dönüşümle başa çıkmak için en iyi uygulama var mı?

Güncelleme 1:

POST isteğimin gövdesine bazı değerler koyabilirim, örneğin "durum": "aktif"

ve hizmetimin içinde tetiklenecek doğru işlemleri kontrol edin.


REST'in komutları HTTP fiillerine eşlemesi karmaşık işlemlerle başarısız olur. Sen daha iyi durumda sadece POST activateSubscription / {id} kimse onun tarafından karıştırılmamalıdır bir RPC stil çağrısı yapıyoruz
Ewan

@Ewan bu RESTful modeli ile uyumlu olduğundan emin değilim, ama başka bir çözüm ile geldi: kodumda girdi yüküne göre uygun RPC tarzı işlemi çağırabilirim (geçiş yapabilirim = gövdesinde aktif olabilir) benim posta isteği, kod aktivasyon kodunu arayacaktır)
Vektor88

1
Bunun gibi varolan bir kaynağa yönelik bir güncelleştirme bir PATCH olmalıdır ve sorgunun gövdesi, değiştirdiğiniz şeyin kısmi bir modelidir. Bir POST'un kaynak oluşturan bir istek olduğu varsayılır. Bu ayrım, kullanıcıya daha açık olmanın yanı sıra, kodunuzun bu işlemin bir kaynak postasından ziyade ne zaman gerçekleştiğini bilmesini kolaylaştıracaktır.
Bay Cochese

1
@ Vektor88 Genellikle, ancak bunlar kaynak durumunun tamamını temsil etmeniz gereken idempotent işlemlerdir. Bu kullanım durumu, bir PATCH'a gerçekten iyi uyan kısmi bir güncellemeye çok benziyor.
Bay Cochese

1
@MrCochese POST idempotent değil.
JimmyJames

Yanıtlar:


8

Jim Webber'in bu konuşmasını izlemelisin .

Aboneliğin durumunu güncellemem gerektiğinde, sunuculara doğrudan bir POST isteği gönderemiyorum, çünkü kaynaklara doğrudan erişimim yok, ancak özelliklerini güncellemek için bazı RPC tarzı işlemleri çağırmam gerekiyor. Ayrıca, yalnızca ve yalnızca aboneliğin durumunu "etkin" olarak değiştirirsem, harici bir hizmete ek bir çağrı yapılması gerekir.

"Mesajlaşmayı" düşünün; alan adınıza ne olmasını istediğinizi açıklayan bir mesaj gönderin. Mesajın yan etkisi, alan modelinizin gerçekte durumunu değiştirmesidir. "Kaynak" mesaj kuyruğudur.

POST /subscriptions/{subscriptionid}/?activate=true

Kaynak adının yazılışı makineler için önemli değildir; ancak kullandığınız tanımlayıcılar kaynakların "isimler" olduğu konvansiyonundan koptuğunda insanlar telaşlı olmaya eğilimlidirler.

Ayrıca, tabi olan bir kaynaktan bahsediyoruz /subscriptions/{subscriptionid}, bu nedenle kongre (bkz. RFC 3986 ), sorgu bölümünü kullanmak yerine bir yol segmentiyle bu ilişkiyi ifade etmeyi gerektirir.

Yani bu yazımlar makul olabilir

POST /subscriptions/{subscriptionid}/messages
POST /subscriptions/{subscriptionid}/activations


0

Onun şeyler etkinleştirmek / devre dışı bırakmak için bir boolean bayrak, varsayılan JSON kullanmak olduğunu söyleyebilirim:

POST /subscriptions/{subscriptionid}/
{
    format: 0,
    subscription: 
    {
        active: false
    }
}

Daha fazla mülkü desteklemek istiyorsanız bu kolayca genişletilebilir. Başka bir yaklaşım, ona kendi uç noktasını vermek:

POST /subscriptions/{subscriptionid}/active/
DELETE /subscriptions/{subscriptionid}/active/

Şahsen, ben sadece activebu olayın durumu gerekiyorsa / sonra bir kullanıcı kimliği veya ayar gibi JSON alabilirsiniz özellikleri / varsa kullanır .

Eğer bir boolean değeri değil, sadece tetiklemeniz gereken ancak bir eylem geri bildirimi (hemen 200 OK hariç) için ihtiyaç duymadığınız bir eylem yoksa, RPC gibi tetiklemek için böyle bir bitiş noktası kullanırdım:

POST /subscriptions/{subscriptionid}/activate/

Şüphe duyduğunuzda şunu okuyun: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#restful (bkz. "CRUD operasyonları dünyasına uymayan eylemler hakkında?" ")


0

REST işlevsel değildir. Activatebir fiildir ve bir devlet olamaz Active, bir devlettir.

RESTful işlevsel olmadığından RESTful hizmetine ne yapması gerektiğini söyleyemezsiniz, ancak hizmet kuyruğu için iş ekleyebilirsiniz.

Bunu gör:

PUT /subscriptionQueue
subscriptionId={subscriptionId}
active=true

Bu istek RESTful'tır ve RESTful'ın (performans, asit ... gibi) tüm faydalarını destekler.

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.