En iyi / yaygın RESTful url fiilleri ve eylemleri nelerdir?


86

En iyi ve en yaygın RESTful url işlemleri hakkında bazı bilgiler bulmaya çalışıyorum.

örneğin, bir öğenin ayrıntılarını görüntülemek, öğeyi düzenlemek, güncellemek vb. için hangi url'yi kullanıyorsunuz?

/question/show/<whatever>
/question/edit/<whatever>
/question/update/<whatever> (this is the post back url)
/question/list   (lists the questions)

hmm. yardım eden herkese teşekkürler :)

Yanıtlar:


174

Eylemlerinizi değil, nesnelerinizi belirtmek için URL'leri kullanın:

İlk bahsettiğiniz şeyin RESTful olmadığını unutmayın:

/questions/show/<whatever>

Bunun yerine, nesnelerinizi belirtmek için URL'lerinizi kullanmalısınız:

/questions/<question>

Ardından bu kaynak üzerinde aşağıdaki işlemlerden birini gerçekleştirirsiniz.


ALMAK:

Bir kaynak elde etmek, bir kaynak listesini sorgulamak ve ayrıca bir kaynakla ilgili salt okunur bilgileri sorgulamak için kullanılır.

Bir soru kaynağı elde etmek için:

GET /questions/<question> HTTP/1.1
Host: whateverblahblah.com

Tüm soru kaynaklarını listelemek için:

GET /questions HTTP/1.1
Host: whateverblahblah.com

İLETİ:

Bir kaynak oluşturmak için kullanılır.

Aşağıdakilerin bir hata olduğunu unutmayın:

POST /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

URL henüz oluşturulmadıysa, adı belirtirken POST'u oluşturmak için kullanmamalısınız. Bu, henüz mevcut olmadığı için bir kaynak bulunamadı hatasıyla sonuçlanmalıdır. Önce kaynağı sunucuya KOYMALISINIZ. Yeni bir soru oluşturarak, ayrıca soru listesinde bir soru daha döndüreceği için / Questions kaynağını güncellediğinizi iddia edebilirsiniz.

POST kullanarak bir kaynak oluşturmak için şuna benzer bir şey yapmalısınız:

POST /questions HTTP/1.1
Host: whateverblahblah.com

Bu durumda kaynak adının belirtilmediğini, yeni nesnelerin URL yolunun size döndürüleceğini unutmayın.

SİL:

Kaynağı silmek için kullanılır.

DELETE /questions/<question> HTTP/1.1
Host: whateverblahblah.com

KOYMAK:

Kaynak URL'sini belirtirken bir kaynak oluşturmak veya üzerine yazmak için kullanılır.

Yeni bir kaynak için:

PUT /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

Mevcut bir kaynağın üzerine yazmak için:

PUT /questions/<existing_question> HTTP/1.1
Host: whateverblahblah.com

...Evet, onlar aynı. PUT genellikle 'düzenleme' yöntemi olarak tanımlanır, çünkü tüm kaynağı biraz değiştirilmiş bir sürümle değiştirerek, istemcilerin bir sonraki yaptıklarında alacaklarını düzenlediniz.


REST'i HTML formlarında kullanma:

HTML5 spektrumu tanımlar GET ve kalıp elemanının POST .

Method content özniteliği, aşağıdaki anahtar sözcükler ve durumlar ile numaralandırılmış bir özniteliktir:

  • GET anahtar sözcüğü, HTTP GET yöntemini gösteren, GET durumuna eşleme.
  • POST anahtar sözcüğü, HTTP POST yöntemini gösteren, POST durumuna eşleme.

Teknik olarak, HTTP spesifikasyonu sizi yalnızca bu yöntemlerle sınırlamaz. Teknik olarak istediğiniz herhangi bir yöntemi eklemekte özgürsünüz, ancak pratikte bu iyi bir fikir değil. Buradaki fikir, herkesin verileri okumak için GET'i kullandığınızı bilmesidir, bu nedenle bunun yerine OKU kullanmaya karar verirseniz, konuların kafasını karıştıracaktır. Bahsedilen...

YAMA:

Bu, resmi bir RFC'de tanımlanan bir yöntemdir. Bir kaynağa yalnızca kısmi bir değişiklik göndermek istediğinizde kullanılmak üzere tasarlanmıştır, PUT'a çok benzer:

PATCH /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

Aradaki fark, PUT'un, gerçekte değiştirilene kıyasla ne kadar büyük olursa olsun, tüm kaynağı göndermesi gerektiğidir, YAMA ise yalnızca değişiklikleri gönderebilirsiniz .


Merhaba Brian .. bunu ne kadar çok okursam, o kadar mantıklı geliyor. Bazı tarayıcıların (veya tarayıcı sürümlerinin) PUT veya DELETE'i desteklemediğini varsayıyorum. durum buysa, bunun yerine POST kullanıyor muyuz?
Pure.Krome

1
Merhaba Pure.Knome; Web tarayıcıları hepsini destekler, ayrıca herhangi bir HTTP kütüphanesi de hepsini desteklemelidir.
Brian R. Bondy

4
Eğer REST hakkında tüm öğrenmek istiyorsanız Bu arada bu kitabı satın öneriyoruz oreilly.com/catalog/9780596529260
Brian R. Bondy

1
@Brian: PUT örnekleriniz hakkında birkaç soru daha. >> PUT / Questions / <new_question> Formdaki tüm veriler yeni kaynağı oluşturmak için kullanılacağı için >> PUT / Questions / yapmak yerine bunu neden yaparsınız? (sonraki yorumun devamı) ...
Pure.Krome

1
@Brian R. Bondy, Harika cevabınız için teşekkürler. Mevcut kaynağa POST isteği, genel "değiştirme" teriminizin aksine, Oreilly'nin dinlendirici kitabında (sayfa: 100,101) "ek" olarak tanımlanır. Sonuçta, ekleme, değiştirmekten daha spesifiktir - bu "PUT'u mevcut bir kaynağa aktarabilir - ve anlamsal olarak POST için daha doğru geliyor - belirtilen bağlantıya yeni kaynak eklemek, buna alt kaynak ekleyerek veya oluşturarak. .
Özgür

11

Varsayım /questions/10Geçerli bir soru olduğunu , yöntem onunla etkileşim kurmak için kullanılır.

Eklenecek POST

Oluşturmak veya değiştirmek için PUT

Görüntülemek / sorgulamak için GET

ve SİLİNİZ iyi .. silin.

URL değişmez.


4
Yanlış. PUT idempotent olmalıdır. Aynı PUT isteğini birçok kez yapabilmelisiniz ve ilk seferden sonra herhangi bir etki yaratmadan. Bu nedenle, her PUT isteğiyle bir kaynak oluşturmak idempotent değildir.
aehlke

3
"PUT ve DELETE yöntemleri idempotent olarak tanımlanmıştır, yani birden fazla özdeş istek tek bir istekle aynı etkiye sahip olmalıdır.", Şu anda bir Kaynağı kullanılabilir yapmayan bir URI'ye koyma kullanılması bir kaynak oluşturabilir. Hemen tekrar PUT yapmak, hiçbir etkisi olmayacak şekilde bunu tekrar yapacaktır. Bu şekilde bir kaynak oluşturuyorsunuz, ancak sorgu hala idempotent. Daha sonra geri gelirseniz ve kaynağı değiştirmek isterseniz, farklı verilerle aynı URI'ye PUT yaparsınız (bu farklı bir istek olur ve kendisi aynı sonuçla herhangi bir sayıda tekrarlanabilir).
Allain Lalonde

1
Aslında, 25 oy alan cevaba bir bakın, PUT'un bir kaynağı oluşturmak veya değiştirmek için kullanılabileceği belirtiliyor.
Allain Lalonde

3
Oluşturma, yalnızca yeni bir kaynağın kimliğinin belirtilmesine izin verildiği sürece çalışır. Mümkün olsa da, kullanıcının POST / toplama ve yeni kimliği içeren bağlantıları
döndürmesi daha uygun olur

2
@aehIke PUT tarafından yeni bir kaynağın oluşturulması, onu idempotent yapmaz, çünkü fikir şu ki eğer 'PUT / items / 10' ve öğe 10 daha önce mevcut değilse, o zaman sadece oluşturulacaktır. Bununla birlikte, ikinci kez tekrar 'PUT / items / 10' yaparsam, şimdi zaten var, bu yüzden sadece değiştirilecek, bu nedenle sonraki PUT isteklerinin yeni bir yan etkisi olmadığı için idempotence korunuyor. (Elbette, her seferinde aynı öğeyi koymaya devam ettiğimi varsayıyoruz)
Alappin

3

Bir uzvun üzerinde gidip tahmin edeceğim, "DİNLENMİŞ" url'ler dediğinizde MVC için standart denetleyicilerin ne olduğunu kastettiğinizi tahmin edeceğim, çünkü örnekleriniz "RESTful" olmayan kabul edilebilir ( bu makaleye bakın).

Rails, ilgilendiğiniz URL stilini gerçekten popüler hale getirdiğinden , Ruby on Rails'de ScaffoldingGenerator tarafından üretilen varsayılan denetleyici eylemlerini aşağıda sunuyorum . Bunlar, Rails uygulamasını kullanan herkese aşina olmalıdır.

Yapı iskeleli eylemler ve görünümler şunlardır: dizin, liste, göster, yeni, oluşturma, düzenleme, güncelleme, yok etme

Genellikle bunu şu şekilde inşa edersiniz:

http://application.com/controller/<action>/<id>

5
Bant dışı URI kuralları DİNLENMEZ. Fielding'in kendisinden alıntı yapmak: "Bir REST API, sabit kaynak adlarını veya hiyerarşileri tanımlamamalıdır (istemci ve sunucunun açık bir şekilde birleştirilmesi). Sunucular kendi ad alanlarını kontrol etme özgürlüğüne sahip olmalıdır. Bunun yerine, sunucuların istemcilere uygun URI'leri nasıl oluşturacakları konusunda talimat vermesine izin verin HTML formlarında ve URI şablonlarında olduğu gibi, bu talimatları medya türleri ve bağlantı ilişkileri içinde tanımlayarak .. "
aehlke

1

REST ilkesini kullanan mevcut URL'lerinizin bir eşlemesi:

/question/show/<whatever>

Soruyu bir kaynak olarak tanımlarsanız, benzersiz bir URL'si olmalıdır. GET'i görüntülemek (geri getirmek) için kullanmak yaygın bir uygulamadır. O olur:

GET /question/<whatever>

/question/edit/<whatever>

Artık kullanıcınızın, kaynağı düzenlemesine izin veren aynı kaynağın başka bir görünümüne sahip olmasını istiyorsunuz (belki form kontrolleriyle).

Buradaki iki seçenek, uygulamanız bir uygulamadır (web sitesi değil), o zaman JavaScript'i kullanarak kaynağı istemci tarafında düzenlenebilir bir kaynağa dönüştürmek için daha iyi olabilirsiniz.

Bu bir web sitesiyse, başka bir görünüm belirtmek için aynı URL'yi ek bilgilerle birlikte kullanabilirsiniz, genel uygulama şöyle görünür:

GET /question/<whatever>;edit

/question/update/<whatever> (this is the post back url)

Bu, soruyu değiştirmek içindir, bu nedenle PUT, kullanılacak doğru yöntemdir:

PUT /question/<whatever>

/question/list   (lists the questions)

Soru listesi aslında bir sorunun ana kaynağıdır, dolayısıyla doğal olarak:

GET /question

Şimdi biraz daha fazlasına ihtiyacınız olabilir:

POST /question (create a new question and returns its URL)
DELETE /question/<whatever> (deletes a question if this is relevant)

Tada :)


-1

Dört örneğiniz şunlar olabilir:

GET /questions/123
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
GET /questions

Bir soru eklemek için:

POST /questions q=What+is+the+meaning+of+life

Sunucu yanıt verir:

200 OK (or 201 Created)
Location: /questions/456
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.