예를 들어 GET 요청을 실행 users/9
하지만 ID가 # 9 인 사용자가 없습니다. 최고의 응답 코드는 무엇입니까?
- 200 OK
- 202 수락
- 204 내용 없음
- 400 잘못된 요청
- 404 찾을 수 없음
답변
TL; DR : 사용 404
이 블로그를 참조하십시오 . 잘 설명되어 있습니다.
에 대한 블로그 의견 요약 204
:
204 No Content
HTTP 스펙에 따르면 브라우저가 ‘보기를 변경하지 마십시오’응답 코드로 이해해야하지만 브라우저의 응답 코드로는 크게 유용하지 않습니다.204 No Content
이다 , 그러나 뭔가를 반환하지 않고 성공을 표시 할 수 있습니다 아약스 웹 서비스에 매우 유용합니다. (원하는 경우에 특히DELETE
또는POST
의 피드백을 필요로하지 않는).
따라서 귀하의 질문에 대한 답변은 404
귀하의 경우에 사용 됩니다. 204
는에 대한 응답으로 브라우저에 자주 반환해서는 안되는 특수 응답 코드입니다 GET
.
도보다 적절한 다른 응답 코드 204
및 404
:
200
성공적으로 가져온 모든 본문으로 반환해야합니다. 가져 오는 엔티티가 존재하지 않는 경우 적절하지 않습니다.202
서버가 오브젝트 작업을 시작했지만 오브젝트가 아직 완전히 준비되지 않은 경우에 사용됩니다. 확실히 여기에는 해당되지 않습니다.GET
요청 에 대한 응답으로 사용자 9의 구성을 시작하지 않았거나 시작하지도 않습니다 . 그것은 모든 종류의 규칙을 어 깁니다.400
형식이 잘못된 HTTP 요청 (예 : 형식이 잘못된 http 헤더, 잘못 정렬 된 세그먼트 등)에 대한 응답으로 사용됩니다. 이것은 사용중인 프레임 워크에 의해 거의 확실하게 처리됩니다. 서버를 처음부터 작성하지 않는 한이 문제를 해결하지 않아도됩니다. 편집 : 최신 RFC 에서는 의미 상 유효하지 않은 요청에 400을 사용할 수 있습니다.
HTTP 상태 코드에 대한 Wikipedia의 설명 이 특히 유용합니다. www.w3.org의 HTTP / 1.1 RFC2616 문서에서 정의 를 볼 수도 있습니다.
답변
빈 데이터로 204 또는 200을 선호하는 404에 강력하게 반대합니다. 또는 적어도 하나는 404와 함께 응답 엔터티를 사용해야합니다.
요청이 접수되어 올바르게 처리되었습니다. 서버에서 응용 프로그램 코드를 트리거했기 때문에 실제로 클라이언트 오류라고 말할 수 없으므로 전체 클라이언트 오류 코드 (4xx) 클래스가 적합하지 않습니다.
더 중요한 것은 404는 여러 가지 기술적 이유로 발생할 수 있습니다. 예를 들어 서버에서 응용 프로그램이 일시적으로 비활성화 또는 제거되고 프록시 연결 문제가 발생하는 등 따라서 클라이언트는 “빈 결과 집합”을 의미하는 404와 “서비스를 찾을 수 없습니다. 나중에 다시 시도하십시오”를 의미하는 404를 구별 할 수 없습니다.
치명적일 수 있습니다. 회사에서 연간 보너스로 인한 모든 직원을 나열하는 회계 서비스를 상상해보십시오. 불행히도 한 번 호출되면 404를 반환합니다. 이는 보너스를받을 사람이 아무도 없거나 현재 새로운 배포를 위해 응용 프로그램이 다운되었음을 의미합니까?
-> 데이터 품질에 관심이있는 애플리케이션의 경우 응답 엔터티가없는 404는 거의 문제가되지 않습니다.
또한 많은 클라이언트 프레임 워크는 추가 질문없이 예외를 발생시켜 404에 응답합니다. 이로 인해 클라이언트 개발자는 해당 예외를 잡아서 평가 한 다음이를 모니터링 구성 요소에 의해 발생한 오류로 기록할지 또는 무시할지 여부에 따라 결정해야합니다. 그것은 나에게도 예쁘지 않은 것 같습니다.
404에 비해 404의 장점은 요청 된 리소스를 찾지 못한 이유에 대한 정보를 포함 할 수있는 응답 엔터티를 반환 할 수 있다는 것입니다. 그러나 이것이 실제로 관련이 있다면 200 OK 응답 사용을 고려하고 페이로드 데이터에서 오류 응답을 허용하는 방식으로 시스템을 설계 할 수도 있습니다. 대안 적으로, 구조화 된 정보를 호출자에게 리턴하기 위해 404 응답의 페이로드를 사용할 수있다. 예를 들어 파싱 할 수있는 XML 또는 JSON 대신 html 페이지를 수신하는 경우 이는 호출자의 관점에서 유효 할 수있는 “결과 없음”응답 대신 기술적 인 문제가 발생했음을 나타내는 좋은 지표입니다. 또는 HTTP 응답 헤더를 사용할 수도 있습니다.
여전히 나는 빈 응답으로 204 또는 200을 선호합니다. 이렇게하면 요청의 기술적 실행 상태가 요청의 논리적 결과와 분리됩니다. 2xx는 “기술적 실행은 괜찮습니다. 결과입니다. 처리합니다”.
나는 빈 결과가 허용되는지 아닌지를 결정하기 위해 클라이언트에게 맡겨야한다고 생각합니다. 올바른 기술적 실행에도 불구하고 응답 엔터티없이 404를 반환함으로써 클라이언트는 단순히 오류가 아닌 오류로 간주 할 수 있습니다.
또 다른 빠른 비유 : “결과 없음”에 대해 404를 반환하는 것은 SQL 쿼리에서 결과가 반환되지 않은 경우 DatabaseConnectionException을 발생시키는 것과 같습니다. 작업을 수행 할 수는 있지만 동일한 예외를 발생시키는 유효한 기술적 인 원인이 많이 있으며 유효한 결과로 오인 될 수 있습니다.
답변
처음에는 204가 의미가 있다고 생각했지만 토론 후에 404가 유일한 정확한 응답이라고 생각합니다. 다음 데이터를 고려하십시오.
사용자 : John, Peter
METHOD URL STATUS RESPONSE
GET /users 200 [John, Peter]
GET /users/john 200 John
GET /users/kyle 404 Not found
GET /users?name=kyle` 200 []
DELETE /users/john 204 No Content
일부 배경 :
-
검색은 배열을 반환하지만 일치하는 항목은 없지만 빈 배열 이라는 내용이 있습니다 .
-
404는 물론 요청 된 서버에서 지원하지 않는 URL로 가장 잘 알려져 있지만 누락 된 리소스는 실제로 동일합니다. 와 일치
하더라도 사용자 Kyle은 사용 가능한 자원이 아니므로 404가 계속 적용됩니다. 검색어가 아니며 동적 URL에 의한 직접 참조 이므로 404입니다./users/:name
users/kyle
어쨌든 내 두 센트 🙂
답변
리소스가 존재하지만 비어있을 것으로 예상되는 경우, 물건이 비어 있음을 나타내는 표현으로 200 OK를 얻는 것이 더 쉬울 수 있다고 주장합니다.
그래서 나는 / things가 전혀 아무것도없는 204보다 { “Items”: []}로 200 OK를 반환하고 싶습니다. 이런 식으로 0 개의 아이템을 가진 컬렉션은 하나 또는 더 많은 항목이 있습니다.
204 PUT 및 DELETE에 대한 내용 없음을 그대로 두겠습니다. 실제로 유용한 표현이 없을 수 있습니다.
/ thing / 9가 실제로 존재하지 않는 경우 404가 적합합니다.
답변
이전 프로젝트에서는 404를 사용했습니다. 사용자 9가 없으면 개체를 찾을 수 없습니다. 따라서 404를 찾을 수 없습니다.
개체가 있지만 데이터가없는 경우 204 콘텐츠가 적합하지 않습니다. 나는 당신의 경우에는 객체가 존재 하지 않는다고 생각합니다.
답변
w3 post 에 따르면
200 OK
요청이 성공했습니다. 응답과 함께 리턴 된 정보는 요청에 사용 된 방법에 따라 다릅니다.
202 수락
처리 요청이 승인되었지만 처리가 완료되지 않았습니다.
204 내용 없음
서버가 요청을 이행했지만 엔티티 본문을 리턴 할 필요가 없으며 업데이트 된 메타 정보를 리턴 할 수 있습니다.
400 잘못된 요청
잘못된 구문으로 인해 서버에서 요청을 이해할 수 없습니다. 클라이언트는 수정없이 요청을 반복해서는 안됩니다
401 무단
요청에는 사용자 인증이 필요합니다. 응답에는 반드시 WWW-Authenticate 헤더 필드가 포함되어야합니다
404 찾을 수 없음
서버가 Request-URI와 일치하는 것을 찾지 못했습니다. 상태가 일시적인지 영구적인지에 대한 표시가 없습니다.
답변
요약하거나 단순화하기 위해
2xx : 선택적 데이터 : 올바른 형식의 URI : 기준이 URI의 일부가 아님 : 기준이 선택적인 경우 @RequestBody에 지정할 수 있으며 @RequestParam은 2xx로 이어집니다. 예 : 이름 / 상태로 필터링
4xx : 예상 데이터 : 형식이 잘못된 URI : 기준이 URI의 일부 임 : @PathVariable에만 지정할 수있는 기준이 필수 인 경우 4xx로 연결되어야합니다. 예 : 고유 한 ID로 조회
따라서 요청 된 상황의 경우 : “users / 9″는 4xx (아마 404)이지만 “users? name = superman”의 경우 2xx (아마도 204) 여야합니다.