Boş tablo için uygun REST yanıtı?


106

Let Diyelim ki arayarak kullanıcıların listesini almak istiyorum demek GETiçin api/users, ama hiçbir kullanıcı yüzden şu anda tablo kesildi. Bu senaryo için doğru yanıt nedir: 404veya 204?


19
200 ve boş bir koleksiyonla yanıt verirdim (boş bir yanıt gövdesi değil, içinde öğe olmayan bir koleksiyon, döndürülen biçime bağlı olarak bu farklı görünecek)
toniedzwiedz

4
Bu bağlamda 404, 'tablo bulunamadı' için muhtemelen daha uygun olacaktır. Boş bir liste iade et derim.
mata


2
@EJoshuaS Değil. Her iki soru da benim ve çok eski. Benzerler ancak kopya değiller.
IMB

1
@EJoshuaS Açıkçası kopya değiller. Bu soru o konu /api/usersile ilgili /api/users/1.
Franklin Yu

Yanıtlar:


230

Ben de söyleyemem.

Neden 404 (Bulunamadı)?

404 durum kodu, bir kaynağın bulunmadığı durumlar için ayrılmalıdır. Bu durumda, kaynağınız bir kullanıcı koleksiyonudur . Bu koleksiyon var ama şu anda boş. Şahsen, 200bir gün ve 404ertesi gün bir güne sahip olsam, uygulamanız için bir istemcinin yazarı olarak kafam çok karışır, çünkü biri birkaç kullanıcıyı kaldırır. Ne yapmam gerekiyor? URL’m yanlış mı? Birisi API'yi değiştirdi ve bir yönlendirme bırakmayı ihmal etti.

Neden 204 (İçerik Yok) değil?

İşte 204 durum kodunun açıklamasından w3c tarafından bir alıntı

Sunucu isteği yerine getirdi, ancak bir varlık gövdesi döndürmesi gerekmiyor ve güncellenmiş meta bilgileri döndürmek isteyebilir.

Bu durumda bu makul görünse de müşterilerin kafasını karıştıracağını düşünüyorum. A'nın 204, bazı işlemlerin başarıyla yürütüldüğünü ve hiçbir verinin döndürülmesi gerekmediğini göstermesi beklenir. Bu, bir DELETEisteğe yanıt olarak veya belki de veri döndürmesi gerekmeyen bazı betikleri çalıştırırken mükemmeldir. Böyle bir durumda, api/usersgenellikle kullanıcı koleksiyonunuzun bir temsilini almayı beklersiniz. Bir yanıt gövdesini bir kez göndermek ve diğerinde göndermemek tutarsızdır ve potansiyel olarak yanıltıcıdır.

Neden 200 kullanmalıyım (Tamam)

Yukarıda belirtilen nedenlerden dolayı (tutarlılık), boş bir koleksiyonun temsilini döndürürdüm. XML kullandığınızı varsayalım. Boş olmayan bir kullanıcı topluluğu için normal bir yanıt gövdesi şöyle görünebilir:

<users>
  <user>
    <id>1</id>
    <name>Tom</name>
  </user>
  <user>
    <id>2</id>
    <name>IMB</name>
  </user>
</users>

ve liste boşsa, buna benzer bir şeyle yanıt verebilirsiniz (hala a kullanırken 200):

<users/>

Her iki durumda da, bir müşteri belirli, iyi bilinen bir formatı izleyen bir yanıt gövdesi alır. Gereksiz kafa karışıklığı ve durum kodu kontrolü yoktur. Ayrıca hiçbir durum kodu tanımı ihlal edilmez. Herkes mutlu.

Aynısını JSON veya HTML veya kullandığınız herhangi bir formatla yapabilirsiniz.


4
Kesinlikle katılıyorum. Ve REST, ben sadece boş bir dizi ile 200 durum kodu göndermesidir olacaktır: [].
Chad Johnson

Mantıklı. Zorlaştırmaya gerek yok. 404 kafa karıştırıcı olabilir.
Witold Kaczurba

Cebinizdeki paraları tanımlayan API'yi uç noktalar ile varsayalım: GET /singleCoin- cebinizden rastgele tek bir jeton GET /severalCoinsdöndürür , - cebinizden bir seferde alabileceğiniz bazı paraları döndürür. Diyelim ki şu anda cebinizde bozuk para yok. Ne zaman istersen GET /singleCoinalırsın 404 Not Found, ama istediğinde boş liste GET /severalCoinsalırsın . Bir gerçek - farklı yanıtlarla tanımlanan bozuk paranız yok, neden? Her zaman almanın daha iyi olduğunu söyleyebilirim , çünkü cebinizde bozuk para yoktur. 200 OK[]404 Not Found
sempasha

1
@sempasha Ne demek istediğine bağlı GET /severalCoins. Bazı madeni paraları iade etmesi GET /severalCoins gerektiğini emrederseniz, o zaman 200 olmamalıdır, çünkü sorun değil; sunucu istemcinin istediğini sağlayamadı. İçin /singleCoinistemci az artık tam olarak bir jeton, istediğim için bu açıktır. Bu aynı /coins/7. /coinsUç noktanın aksine , tipik olarak müşteriler madeni para, bir madeni para veya birden fazla madeni para beklemiyor. Hepsi geçerli yanıttır. Madeni para yoksa, istedikleri bu. List<Coin>Java yerine bir imparatorluk gibi null.
Franklin Yu

15

Çalışma zamanı durumuna bağlı olarak iki koddan birini yanıtlardım:

404 Bulunamadı)

Tablonuz yoksa bu cevap oldukça doğrudur. Sadece boş tablo değil, KULLANICI TABLOSU YOK. Kesin fikri doğrular - kaynak yok. Diğer seçenekler, daha fazla ayrıntı sağlamaktır. NEDEN masanız yoktur, birkaç tane daha ayrıntılı kod vardır, ancak 404, gerçekten masanızın olmadığı duruma atıfta bulunmak için oldukça iyidir.

200 (Tamam)

Tablonuzun olduğu ancak boş olduğu tüm durumlar veya istek işlemciniz tüm sonuçları filtreledi. Bu, 'talebiniz doğru, her şey yolunda, ancak sırf bizim elimizde veri olmadığı için veya isteğinizle eşleşen verimiz olmadığı için hiçbir veriyle eşleşmiyorsunuz' anlamına gelir. Bu, güvenlik reddi yanıtından farklı olmalıdır. Ayrıca, bazı verilere sahip olduğunuz ve genel olarak tabloya erişmenize izin verildiği, ancak isteğinizle eşleşen tüm verilere erişiminiz olmadığı durumda 200 döndürmek için oy veriyorum (veriler, nesne düzeyinde güvenlik nedeniyle filtrelendi, ancak genel olarak izniniz var istek).


10

Kullanıcı nesnesi listesi bekliyorsanız, en iyi çözüm 404 veya 204 yanıtı kullanmak yerine 200 OK ile boş bir liste ([]) döndürmektir.


2

kesinlikle 200 döndürür.

404, kaynak bulunamadı anlamına gelir. Ancak kaynak var. Ve ayrıca, cevabın 404 durumu varsa. Kullanıcı listesinin boş veya dolu olduğunu nasıl bilebilirsiniz?


  • '/ kullanıcılar' boşsa '200' döndürmelidir.
  • Kimlik bulunmazsa '/ kullanıcılar / 1'. 404 döndürmelidir.

2

Boş liste ile 200 OK olmalıdır .

Nedeni: Boş tablo, tablonun var olduğu ancak herhangi bir kayıt bulunmadığı anlamına gelir.

404 Bulunamadı , istenen uç noktanın mevcut olmadığı anlamına gelir.

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.