"항목을 찾을 수 없음"오류 페이지에 가장 적합한 HTTP 상태 코드는 무엇입니까?


117

"항목이 존재하지 않습니다"페이지에 가장 적합한 HTTP 상태 코드가 무엇인지 궁금합니다.

페이지 자체가 존재하지 않는 경우에는 분명히 404를 사용하겠습니다. 그러나 내 페이지 중 하나에 userid인수 ( "사용자 편집"페이지)가 있고 지정된 사용자 ID를 가진 사용자가없는 경우에는 오류 페이지이지만 4xx 상태 헤더도 보내고 싶습니다 ( "200 OK"가 실제로 맞지 않기 때문에).

404는 "찾을 수 없음"이고 "파일을 찾을 수 없음"이 아니기 때문에 괜찮을 것 같지만이 경우에 더 나은 코드가 있는지 궁금합니다.

답변:


139

모호한 HTTP 오류 코드로 지나치게 영리 해지는 것은 나쁜 생각입니다. 브라우저는 때때로 상황을 혼란스럽게하는 도움이되지 않는 방식으로 반응합니다. 404를 고수하십시오.


14
좋은 조언을 제공 :( 강박증을하지 404 모든 일에 대해 젠장 진짜 생각입니다.
캐리 켄달

16
404 오류는 잘못된 URI와 엔티티를 찾을 수없는 것을 구분하기 위해 다소 모호합니다. 404를 명확하게하려면 새로운 표준 코드가 필요합니다.
Breakskater

2
모호한 상태 코드를 반환하는 것보다 204 개의 빈 콘텐츠를 반환하는 것을 선호합니다
hsnslh

46

404 리턴 코드는 실제로 '리소스를 찾을 수 없음'을 의미하며 요청이 이루어졌지만 충족되지 않은 모든 엔티티에 적용됩니다. 따라서 페이지, 페이지의 하위 섹션 및 렌더링 할 특정 요청이있는 페이지에있는 모든 항목에 대해 동일하게 작동합니다.

따라서 404는이 시나리오에서 사용할 올바른 코드입니다. 이 점에 유의 하지 않습니다 에 적용 요청이 발행하지만 대답을하지만, 요청 된 자원없이 반대, 전혀 대답하지 않은있는 다른 상황 인, '서버를 찾을 수 없음'.


1
foo 개체를 id = 1로 업데이트하고 데이터베이스에이 ID를 가진 foo가 없으면 어떻게합니까?
valijon

1
이 시나리오에서는 수정해야 할 동시성 문제가 있습니다. id = 1 인 개체를 검색하고 업데이트하려고 할 때 더 이상 존재하지 않는 경우 다른 스레드 또는 프로세스에서 잠금을 무시하거나 잠금을 설정하지 않았습니다. 삭제했습니다. 그 좋지 않다. 또는 먼저 개체가 존재하는지 확인하지 않고 개체 id = n (n이 제공됨)을 업데이트하려는 경우 업데이트 논리에 유효성 검사 단계가 누락되어 좋지 않습니다.
Eight-Bit Guru


8

이는 사용자 ID가 리소스 식별자인지 또는 추가 매개 변수인지에 따라 다릅니다. 그렇다면 404를 반환해도 괜찮습니다. 그렇지 않으면 다음과 같은 다른 코드를 반환 할 수 있습니다.

400 (bad request) ‐ indicates a bad request
또는
412 (Precondition Failed) e.g. conflict by performing conditional update

무료 InfoQ Explores : REST 책에 대한 추가 정보 .


1
"추가 매개 변수"라는 말은 헤더 필드 요청을 의미합니까? 그렇지 않으면 412를 사용하지 않는 것이 좋습니다. "412 (Precondition Failed) 상태 코드는 요청 헤더 필드에 제공된 하나 이상의 조건이 서버에서 테스트 될 때 false로 평가되었음을 나타냅니다."
oferei
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.