빈 테이블에 대한 적절한 REST 응답?


106

을 호출 GET하여 사용자 목록을 가져 오려고 api/users하지만 현재 테이블이 잘려서 사용자가 없다고 가정 해 보겠습니다 . 어떤이 시나리오에 대한 적절한 응답은 다음과 같습니다 404204?


19
나는 200로 응답 줄과 빈 콜렉션 (반환되지 빈 응답 본문이 아니라 내부의 어떤 요소가 컬렉션이는 형식에 따라 다르게 나타납니다)
toniedzwiedz

4
이 컨텍스트에서 404는 아마도 '테이블을 찾을 수 없음'에 더 적합 할 것입니다. 빈 목록을 반환한다고 말하고 싶습니다.
mata


2
@EJoshuaS 아니에요. 두 질문 모두 내 것이었고 아주 오래되었습니다. 유사하지만 중복되지는 않습니다.
IMB

1
@EJoshuaS 그들은 분명히 중복되지 않습니다. 이 질문에 관한 /api/users하나에 대해 동안 /api/users/1.
Franklin Yu

답변:


230

나도 말하고 싶다.

404 (찾을 수 없음)가 아닌 이유는 무엇입니까?

404 상태 코드는 리소스를 찾을 수없는 상황을 위해 예약해야합니다. 이 경우 리소스는 사용자 모음입니다 . 이 컬렉션은 존재하지만 현재 비어 있습니다. 개인적으로 누군가가 몇 명의 사용자를 제거했기 때문에 200하루와 404다음 날 이 있으면 응용 프로그램의 클라이언트 작성자로서 매우 혼란 스러울 것 입니다. 나는 무엇을해야합니까? 내 URL이 잘못 되었나요? 누군가 API를 변경하고 리디렉션을 무시 했습니까?

204 (콘텐츠 없음)가 아닌 이유는 무엇입니까?

다음 은 w3c의 204 상태 코드 설명 에서 발췌 한 것입니다 .

서버가 요청을 수행했지만 엔티티 본문을 반환 할 필요가 없으며 업데이트 된 메타 정보를 반환 할 수 있습니다.

이 경우 합리적으로 보일 수 있지만 클라이언트를 혼란스럽게 할 수도 있습니다. A 204는 일부 작업이 성공적으로 실행되었으며 데이터를 반환 할 필요가 없음을 나타냅니다. 이는 DELETE요청에 대한 응답으로 완벽 하거나 데이터를 반환 할 필요가없는 일부 스크립트를 실행할 수 있습니다. 의 경우 api/users일반적으로 사용자 컬렉션의 대표를받을 것으로 예상합니다. 응답 본문을 한 번 보내고 다른 번에는 보내지 않는 것은 일관성이없고 잠재적으로 오해의 소지가 있습니다.

200을 사용하는 이유 (OK)

위에서 언급 한 이유 (일관성)로 인해 빈 컬렉션의 표현을 반환합니다. XML을 사용하고 있다고 가정 해 보겠습니다. 비어 있지 않은 사용자 컬렉션에 대한 일반적인 응답 본문은 다음과 같습니다.

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

목록이 비어 있으면 다음과 같이 응답 할 수 있습니다 (아직 사용하는 동안 200).

<users/>

어느 쪽이든 클라이언트는 잘 알려진 특정 형식을 따르는 응답 본문을받습니다. 불필요한 혼동 및 상태 코드 검사가 없습니다. 또한 상태 코드 정의를 위반하지 않습니다. 모두가 행복합니다.

JSON이나 HTML 또는 사용중인 모든 형식으로 동일한 작업을 수행 할 수 있습니다.


4
확실히 동의합니다. REST의 경우 빈 배열을 사용하여 상태 코드 200을 반환합니다 [].
Chad Johnson

말이된다. 더 어렵게 만들 필요가 없습니다. 404는 혼란 스러울 것입니다.
Witold Kaczurba

GET /singleCoin-주머니에서 임의의 단일 동전을 GET /severalCoins반환하고 , -주머니에서 한 번에 잡을 수있는 동전을 반환 하는 API를 가정 해 보겠습니다 . 지금 주머니에 동전이 없다고 가정 해 보겠습니다. 당신이 요청할 때 GET /singleCoin얻을 수 404 Not Found있지만, 당신이 요청할 때 빈 목록을 GET /severalCoins얻을 것 200 OK입니다 []. 한 가지 사실-다른 응답으로 설명 된 동전이 없습니다. 이유가 무엇입니까? 나는 404 Not Found주머니에 동전이 없기 때문에 항상 얻는 것이 더 낫다고 말합니다 .
sempasha

1
@sempasha 그것은 당신이 의미하는 바에 따라 다릅니다 GET /severalCoins. 일부 동전을 반환 GET /severalCoins 해야한다고 명령하는 경우 괜찮지 않기 때문에 200이되어서는 안됩니다. 서버가 클라이언트가 원하는 것을 제공하지 못했습니다. 들어 /singleCoin클라이언트가 더 적은 더 이상 정확히 하나 개의 동전을, 원하는 없기 때문에이 분명하다. 이것은 /coins/7. /coins엔드 포인트와 달리 클라이언트는 일반적으로 코인이 없거나, 코인 하나 또는 여러 개를 기대합니다. 그들 모두는 유효한 응답입니다. 동전이 없으면 이것이 그들이 원하는 것입니다. . List<Coin>대신 Java 의 emply와 같습니다 null.
Franklin Yu

15

런타임 상황에 따라 두 가지 코드 중 하나에 대답합니다.

404 찾을 수 없음)

이 대답은 테이블이 없으면 매우 정확합니다. 빈 테이블이 아니라 사용자 테이블이 없습니다. 정확한 아이디어를 확인합니다. 리소스가 없습니다. 추가 옵션은 테이블이없는 이유에 대한 자세한 정보를 제공하는 것입니다. 몇 가지 자세한 코드가 있지만 404는 실제로 테이블이없는 상황을 참조하는 데 매우 좋습니다.

200 (OK)

테이블이 있지만 비어 있거나 요청 프로세서가 모든 결과를 필터링 한 모든 경우. 이는 '귀하의 요청이 정확하고 모든 것이 정상이지만 데이터가 없거나 귀하의 요청과 일치하는 데이터가 없기 때문에 귀하는 어떤 데이터와도 일치하지 않습니다. 이것은 보안 거부 답변과 달라야합니다. 또한 일부 데이터가 있고 일반적으로 테이블에 액세스 할 수 있지만 요청과 일치하는 모든 데이터에 액세스 할 수없는 상황에서 200을 반환하도록 투표합니다 (데이터는 개체 수준 보안으로 인해 필터링되었지만 일반적으로 의뢰).


10

사용자 개체 목록을 예상하는 경우 가장 좋은 해결책은 404 또는 204 응답을 사용하는 것보다 200 OK로 빈 목록 ([])을 반환하는 것입니다.


2

확실히 200을 반환합니다.

404는 리소스를 찾을 수 없음을 의미합니다. 그러나 자원은 존재합니다. 또한 응답이 404 상태 인 경우. 사용자 목록이 비어 있거나 채워져 있는지 어떻게 알 수 있습니까?


  • '/ users'가 비어 있으면 '200'을 반환해야합니다.
  • ID가 없으면 '/ users / 1'입니다. 404를 반환해야합니다.

2

목록이 비어 있으면 200 OK 여야 합니다.

이유 : 빈 테이블은 테이블이 있지만 레코드가 없음을 의미합니다.

404 찾을 수 없음 은 요청 된 끝 점이 존재하지 않음을 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.