[rest] 유효한 요청이지만 빈 데이터에 적합한 REST 응답 코드는 무엇입니까?

예를 들어 GET 요청을 실행 users/9하지만 ID가 # 9 인 사용자가 없습니다. 최고의 응답 코드는 무엇입니까?

  • 200 OK
  • 202 수락
  • 204 내용 없음
  • 400 잘못된 요청
  • 404 찾을 수 없음


답변

TL; DR : 사용 404

이 블로그를 참조하십시오 . 잘 설명되어 있습니다.

에 대한 블로그 의견 요약 204:

  1. 204 No Content HTTP 스펙에 따르면 브라우저가 ‘보기를 변경하지 마십시오’응답 코드로 이해해야하지만 브라우저의 응답 코드로는 크게 유용하지 않습니다.
  2. 204 No Content 이다 , 그러나 뭔가를 반환하지 않고 성공을 표시 할 수 있습니다 아약스 웹 서비스에 매우 유용합니다. (원하는 경우에 특히 DELETE또는 POST의 피드백을 필요로하지 않는).

따라서 귀하의 질문에 대한 답변은 404귀하의 경우에 사용 됩니다. 204는에 대한 응답으로 브라우저에 자주 반환해서는 안되는 특수 응답 코드입니다 GET.

도보다 적절한 다른 응답 코드 204404:

  1. 200성공적으로 가져온 모든 본문으로 반환해야합니다. 가져 오는 엔티티가 존재하지 않는 경우 적절하지 않습니다.
  2. 202서버가 오브젝트 작업을 시작했지만 오브젝트가 아직 완전히 준비되지 않은 경우에 사용됩니다. 확실히 여기에는 해당되지 않습니다. GET요청 에 대한 응답으로 사용자 9의 구성을 시작하지 않았거나 시작하지도 않습니다 . 그것은 모든 종류의 규칙을 어 깁니다.
  3. 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

일부 배경 :

  1. 검색은 배열을 반환하지만 일치하는 항목은 없지만 빈 배열 이라는 내용이 있습니다 .

  2. 404는 물론 요청 된 서버에서 지원하지 않는 URL로 가장 잘 알려져 있지만 누락 된 리소스는 실제로 동일합니다. 와 일치
    하더라도 사용자 Kyle은 사용 가능한 자원이 아니므로 404가 계속 적용됩니다. 검색어가 아니며 동적 URL에 의한 직접 참조 이므로 404입니다./users/:nameusers/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) 여야합니다.