부모 리소스를 찾을 수 없을 때 POST에 적합한 응답 상태 코드는 무엇입니까?


10

나는 다음 끝점을 가지고 있습니다.

a/{id}/b

bwith with 보내는 POST요청 을 작성하려고 합니다. 만약 a주어진와 {id}내가 함께은 응답해야 찾을 수 없습니다 404 NOT_FOUND또는 어쩌면로 409 CONFLICT?

평범한 것을 다루는 a/{id}것이 중요합니다. 여기서는 하위 리소스가 사용됩니다.


답변:


15

404 NOT FOUND이 ID의 리소스가 존재하지 않기 때문에 적절한 응답으로 보입니다. 이해하는 것이 매우 분명하며 a/{id}호출 되면 동일한 응답을 기대합니다 .

409 CONFLICT예제에서 부모 리소스를 찾을 수 없을 때 409를 반환하기 때문에 더 나은 선택은 아닙니다 . :).

그러나 가장 중요한 것은 API에서 일관성이 있음을 기억하십시오.


동의한다. 존재하지 않는 폴더에 쓰려고하면 충돌 또는 폴더 누락 오류입니까? 이 방법은 나에게 더 직관적 인 것 같습니다.
Neil

"폴더"는 존재하지 않는 경로를 의미합니까?
Dherik

파일 시스템과 같은 폴더를 의미합니다.
Neil

시나리오를 자세히 설명 할 수 있습니까? 그것은 달려 있기 때문에. 폴더가 서버에 대해 예상되고 어떤 이유로 든 존재 하지 않는 경우 클라이언트 오류 (4xx)가 아닌 서버 오류 (5xx) 라고 생각합니다 . 이 폴더 값이 클라이언트에 의해 리소스 ( id)로 전달 된 경우 404입니다. 그러나 폴더가 본문에 전달 된 경우 다른 것 (412, 422 ... "유효성 검증 실패 : 폴더는 존재하지 않습니다 "). 질문하고 토론하는 것은 좋은 질문입니다.
Dherik

서버에 /nonexistent/help.html 경로가있는 파일을 요청하고 / nonexistent 폴더가 존재하지 않는 경우에는 이에 대한 명확한 응답이 하나만 있습니다. 404 파일을 찾을 수 없습니다! /home/help.html이 존재할 수도 있으며 응답은 다르지 않습니다. 이것은 분명히 REST 응용 프로그램이지만 논리가 바뀌는 이유는 없습니다. 부모가 먼저 존재해야합니다.
Neil

4

@Dherik의 답변 외에도.

URI는 identifiers 이므로 ( /a/{id}/b식별자) 를 명심해야합니다 . URI는 가 WWW에 대한 의미가 없다, 그래서 HTTP 클라이언트입니다.

404 가 정답 입니다. 본질적으로 서버가 응답하고 있습니다

그런 ID를 가진 리소스를 찾지 못했습니다. 리소스를 찾을 수 없습니다 1

누락 된 리소스가 부모 인지 자식인지 는 중요하지 않습니다.

개발자 는 URI에서 계층과 경로 를 볼 수 있지만 HTTP 클라이언트는 그렇지 않습니다. 다시 말해서 HTTP는 HTTP 클라이언트에 의해서만 해석되고 인간 (개발자, 최종 사용자 등)에 의해서는 해석되지 않습니다.

의심스러운 경우 어떤 코드가 자신에게 적합한 지 묻지 마십시오 (인간). HTTP 클라이언트에 어떤 코드가 적합한 지 묻습니다. HTTP 클라이언트의 동작을 어떻게 원하십니까?

왜? 일부 상태 코드로 인해 이러한 클라이언트가 특정 작업을 수행하기 때문입니다. 예를 들어, 302 입니다. 이 코드는 일반적으로 웹 브라우저가 응답 헤더에 통보 된 특정 위치 (URI)로 리디렉션되도록합니다.

이것은 귀하의 경우가 아닐 수도 있지만 알고 있어야합니다. 궁극적으로 HTTP 상태 코드는 HTTP 클라이언트로 전달됩니다. 우리의 응용 프로그램이 아닙니다. 사람이 아닙니다.


1 : 409 는 탐색 오류로 거의 구현되지 않습니다. 일반적으로 원격 작업 (삭제, 업데이트, 새로 만들기 등)을 실행합니다. 그러나 URI가 존재해야합니다. 그렇지 않으면 404가 우선합니다

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