을 호출 GET
하여 사용자 목록을 가져 오려고 api/users
하지만 현재 테이블이 잘려서 사용자가 없다고 가정 해 보겠습니다 . 어떤이 시나리오에 대한 적절한 응답은 다음과 같습니다 404
나 204
?
/api/users
하나에 대해 동안 /api/users/1
.
을 호출 GET
하여 사용자 목록을 가져 오려고 api/users
하지만 현재 테이블이 잘려서 사용자가 없다고 가정 해 보겠습니다 . 어떤이 시나리오에 대한 적절한 응답은 다음과 같습니다 404
나 204
?
/api/users
하나에 대해 동안 /api/users/1
.
답변:
나도 말하고 싶다.
404 상태 코드는 리소스를 찾을 수없는 상황을 위해 예약해야합니다. 이 경우 리소스는 사용자 모음입니다 . 이 컬렉션은 존재하지만 현재 비어 있습니다. 개인적으로 누군가가 몇 명의 사용자를 제거했기 때문에 200
하루와 404
다음 날 이 있으면 응용 프로그램의 클라이언트 작성자로서 매우 혼란 스러울 것 입니다. 나는 무엇을해야합니까? 내 URL이 잘못 되었나요? 누군가 API를 변경하고 리디렉션을 무시 했습니까?
다음 은 w3c의 204 상태 코드 설명 에서 발췌 한 것입니다 .
서버가 요청을 수행했지만 엔티티 본문을 반환 할 필요가 없으며 업데이트 된 메타 정보를 반환 할 수 있습니다.
이 경우 합리적으로 보일 수 있지만 클라이언트를 혼란스럽게 할 수도 있습니다. A 204
는 일부 작업이 성공적으로 실행되었으며 데이터를 반환 할 필요가 없음을 나타냅니다. 이는 DELETE
요청에 대한 응답으로 완벽 하거나 데이터를 반환 할 필요가없는 일부 스크립트를 실행할 수 있습니다. 의 경우 api/users
일반적으로 사용자 컬렉션의 대표를받을 것으로 예상합니다. 응답 본문을 한 번 보내고 다른 번에는 보내지 않는 것은 일관성이없고 잠재적으로 오해의 소지가 있습니다.
위에서 언급 한 이유 (일관성)로 인해 빈 컬렉션의 표현을 반환합니다. XML을 사용하고 있다고 가정 해 보겠습니다. 비어 있지 않은 사용자 컬렉션에 대한 일반적인 응답 본문은 다음과 같습니다.
<users>
<user>
<id>1</id>
<name>Tom</name>
</user>
<user>
<id>2</id>
<name>IMB</name>
</user>
</users>
목록이 비어 있으면 다음과 같이 응답 할 수 있습니다 (아직 사용하는 동안 200
).
<users/>
어느 쪽이든 클라이언트는 잘 알려진 특정 형식을 따르는 응답 본문을받습니다. 불필요한 혼동 및 상태 코드 검사가 없습니다. 또한 상태 코드 정의를 위반하지 않습니다. 모두가 행복합니다.
JSON이나 HTML 또는 사용중인 모든 형식으로 동일한 작업을 수행 할 수 있습니다.
[]
.
GET /singleCoin
-주머니에서 임의의 단일 동전을 GET /severalCoins
반환하고 , -주머니에서 한 번에 잡을 수있는 동전을 반환 하는 API를 가정 해 보겠습니다 . 지금 주머니에 동전이 없다고 가정 해 보겠습니다. 당신이 요청할 때 GET /singleCoin
얻을 수 404 Not Found
있지만, 당신이 요청할 때 빈 목록을 GET /severalCoins
얻을 것 200 OK
입니다 []
. 한 가지 사실-다른 응답으로 설명 된 동전이 없습니다. 이유가 무엇입니까? 나는 404 Not Found
주머니에 동전이 없기 때문에 항상 얻는 것이 더 낫다고 말합니다 .
GET /severalCoins
. 일부 동전을 반환 GET /severalCoins
해야한다고 명령하는 경우 괜찮지 않기 때문에 200이되어서는 안됩니다. 서버가 클라이언트가 원하는 것을 제공하지 못했습니다. 들어 /singleCoin
클라이언트가 더 적은 더 이상 정확히 하나 개의 동전을, 원하는 없기 때문에이 분명하다. 이것은 /coins/7
. /coins
엔드 포인트와 달리 클라이언트는 일반적으로 코인이 없거나, 코인 하나 또는 여러 개를 기대합니다. 그들 모두는 유효한 응답입니다. 동전이 없으면 이것이 그들이 원하는 것입니다. . List<Coin>
대신 Java 의 emply와 같습니다 null
.
런타임 상황에 따라 두 가지 코드 중 하나에 대답합니다.
404 찾을 수 없음)
이 대답은 테이블이 없으면 매우 정확합니다. 빈 테이블이 아니라 사용자 테이블이 없습니다. 정확한 아이디어를 확인합니다. 리소스가 없습니다. 추가 옵션은 테이블이없는 이유에 대한 자세한 정보를 제공하는 것입니다. 몇 가지 자세한 코드가 있지만 404는 실제로 테이블이없는 상황을 참조하는 데 매우 좋습니다.
200 (OK)
테이블이 있지만 비어 있거나 요청 프로세서가 모든 결과를 필터링 한 모든 경우. 이는 '귀하의 요청이 정확하고 모든 것이 정상이지만 데이터가 없거나 귀하의 요청과 일치하는 데이터가 없기 때문에 귀하는 어떤 데이터와도 일치하지 않습니다. 이것은 보안 거부 답변과 달라야합니다. 또한 일부 데이터가 있고 일반적으로 테이블에 액세스 할 수 있지만 요청과 일치하는 모든 데이터에 액세스 할 수없는 상황에서 200을 반환하도록 투표합니다 (데이터는 개체 수준 보안으로 인해 필터링되었지만 일반적으로 의뢰).