http DELETE를 사용하여 리소스 삭제


123

그래서, Http의 DELETE 동사가 멱 등성이라는 점을 감안할 때, 다음 요청을 발행 할 때 두 번째 (또는 세 번째, 네 번째 등)는 어떻게됩니까?

DELETE /person/123

처음에는 리소스가 삭제되고 204 (성공, 콘텐츠 없음)가 반환됩니다. 후속 호출에서 204를 반환해야합니까, 아니면 404 (찾을 수 없음)를 반환해야합니까?

답변:


153

상태 비 저장 시스템의 HTTP 요청은 독립적이어야하므로 한 요청의 결과가 이전 요청에 의존해서는 안됩니다. 두 사용자가 동일한 리소스에서 동시에 삭제를 수행 한 경우 어떻게되는지 고려하십시오. 두 번째 요청이 404를 얻는 것이 합리적입니다. 한 사용자가 두 번 요청하는 경우에도 마찬가지입니다.

나는 DELETE가 두 가지 다른 응답을 반환하는 것이 멱등하다고 느끼지 않는다고 생각합니다. 멱등 요청을 시스템을 동일한 상태로 남겨 두는 것으로 생각하는 것이 유용하며 반드시 동일한 응답을 가질 필요는 없습니다. 따라서 기존 자원을 삭제하든 존재하지 않는 자원을 삭제하려고하든 관계없이 서버 자원 상태는 동일합니다.


4
감사합니다. 정말 말이 되네요. 나는 실제로 동일한 응답을 반환하는 멱 등성을 생각하고 있었다.
Craig Wilson

4
@ 크레이그 조심해! Cookbook에서 Subbu는 내가 방금 말한 것과 완전히 모순됩니다. 그는 멱 등성이 동일한 응답을 반환해야 함을 의미한다고 말합니다. 운 좋게도 Subbu는 RESTFest에있을 것이므로 거기에서 그와 함께 명확히하겠습니다.
Darrel Miller

57
존재하지 않는 것을 삭제하면 204 만 반환해야합니다 (리소스가 존재하지 않더라도). 클라이언트는 리소스가 사라지기를 원했지만 사라졌습니다. 404를 반환하면 클라이언트에 중요하지 않은 내부 처리가 노출되어 불필요한 오류 조건이 발생합니다.
Brian

9
@DarrelMiller 여기서 핵심 개념은 리소스가 있는지 확인하기 위해 DELETE를 사용해서는 안된다는 것입니다. 먼저 GET을 사용합니다. 그런 다음 응답이 200이면 DELETE를 수행합니다. 그렇지 않으면 그렇게하지 마세요. 따라서 DELETE에서 항상 204를 반환하는 것이 합리적이라고 생각합니다.
manei_cc

10
@Brian RFC는 rm. rm존재하지 않는 경우 오류를 반환합니다. tools.ietf.org/html/rfc7231#section-4.3.5
Dax Fohl

32

RESTful 웹 서비스 쿡북은이를위한 훌륭한 리소스입니다. 우연히 Google 미리보기 는 DELETE에 대한 페이지를 표시합니다 (11 페이지).

DELETE 메소드는 멱 등성입니다. 이는 서버가 이전 요청에서 리소스를 삭제 한 경우에도 서버가 응답 코드 200 (OK)을 반환해야 함을 의미합니다. 그러나 실제로 DELETE를 멱등 작업으로 구현하려면 서버가 삭제 된 모든 리소스를 추적해야합니다. 그렇지 않으면 404 (찾을 수 없음)를 반환 할 수 있습니다.


예, 훌륭한 리소스처럼 보입니다. 그러나 DELETE 섹션은 나를 위해 당기지 않습니다 (23 페이지이며 미리보기에 수정되었습니다). 이 책을 읽었습니까? 내 질문에 대한 답을 아십니까?
Craig Wilson

이 책은 REST를 구축하는 데 꼭 필요한 책입니다 (특히 언어가 아닌).
yves amsellem 2011-06-22

7
@Craig Cookbook을 읽으면 이미 삭제 했더라도 200 OK를 반환해야한다고 말합니다. 그러나 실제로 서버가 삭제 된 모든 리소스를 추적해야하므로 404를 사용할 수 있습니다. 보안 문제로 인해 항상 404를 반환해야 할 수도 있습니다. Page 11.
Darrel Miller

+1 Second 및 RESTful 서비스 설계를위한 책을 적극 권장합니다.
Paul DelRe 2011-06-22

18
글쎄, 그 책은 틀렸다. 멱등 성은 상태 코드가 동일하다는 것을 의미하지 않습니다. 관련된 것은 서버의 최종 상태입니다.
Julian Reschke 2012 년

13

나는 현재 선택된 대답이 말한 것에 동의 합니다 .2nd (및 3rd, 4th, ...) DELETE는 404를 받아야합니다 . 그리고 저는 답변이 143 표를 받았지만 반대 의견도 54 표를 받았기 때문에 커뮤니티는 대략 3 : 1 비율로 2 개의 캠프로 나뉩니다. 이 오랜 논쟁을 해결하기 위해 더 많은 정보가 있습니다.

  1. 우선, "내"가 생각하는 것, "당신"이 생각하는 것 또는 다른 책 저자가 생각하는 것부터 시작하지 말자. HTTP 사양, 즉 RFC 7231부터 시작하겠습니다.

    • RFC 7231, 섹션 4.3.5 DELETE 는 성공적인 응답이 2xx 여야한다고 만 언급했지만 후속 DELETE가 얻을 수있는 것을 호출하지 않았습니다. 그러니 더 깊이 파헤쳐 보겠습니다.
    • RFC 7231, 섹션 6.5.4 404 Not Found 는 404 응답이 리소스에 대한 것이 없음 을 나타냅니다. 특정 http 메소드 (특히 DELETE가 아님)가 달리 처리되도록 호출되지 않았기 때문에, 우리는 직관적으로 인상을 얻을 수 있습니다 (그리고 당연히 그렇습니다). 내 요청 DELETE /some/resource/which/does/not/exist은 404가되어야합니다. 그런 다음 DELETE /some/resource/which/happened/to/be/removed/by/someone/else/five/days/ago404를 반환 할 수도 있습니다. 그렇다면 왜 DELETE /some/resource/i/deleted/five/seconds/ago달라야합니까? "하지만 멱등 성은 어때?!", 당신이 소리 치는 소리가 들립니다. 잠시만 요, 우리는 그것에 대해 곧 시작합니다.
    • 역사적으로 1999 년에 발표 된 RFC 2616은 가장 많이 참조 된 HTTP 1.1 사양이었습니다. 불행히도 멱등성에 대한 설명은 모호 하여 이러한 모든 논쟁의 여지가 있습니다. 그러나 해당 사양은 RFC 7231 로 대체되었습니다. RFC 7231, 섹션 4.2.2 멱 등성 방법 에서 인용 , 내 강조 :

      요청 방법은 해당 방법을 사용하는 여러 동일한 요청의 서버에 대한 의도 된 효과가 단일 요청의 효과와 동일한 경우 "멱 등성"으로 간주됩니다. 이 사양에 정의 된 요청 메서드 중 PUT, DELETE 및 안전 요청 메서드 는 멱등 적 입니다.

      따라서 사양에 기록되어 있으며 멱등 성은 서버에 미치는 영향에 관한 것입니다. 204를 반환하는 첫 번째 DELETE와 404를 반환하는 후속 DELETE, 이러한 다른 상태 코드는 DELETE를 비멱 등하게 만들지 않습니다. 이 인수를 사용하여 후속 204 수익을 정당화하는 것은 단순히 관련이 없습니다.

  2. 좋습니다. 멱등성에 관한 것이 아닙니다. 그러나 후속 질문은 다음 DELETE에서 여전히 204를 사용하도록 선택하면 어떻게 될까요? 괜찮습니까?

    좋은 질문. 동기는 이해할 수 있습니다. 클라이언트가 오류 처리에 대해 걱정하지 않고 의도 한 결과에 도달 할 수 있도록하는 것입니다. 후속 DELETE에서 204를 반환하는 것은 서버 측에서 거의 무해한 "하얀 거짓말"이며 클라이언트 측에서는 즉시 차이를 말하지 않습니다. 그렇기 때문에 약 25 %의 사람들이 야생에서 그렇게하고 있으며 여전히 작동하는 것처럼 보입니다. GET /non-exist404를 반환하지만 DELETE /non-exist204를 제공 하기 때문에 그러한 거짓말은 의미 상 이상하다고 간주 될 수 있습니다 . 그 시점에서 클라이언트는 귀하의 서비스가 섹션 6.5.4 404 Not Found를 완전히 준수하지 않는다는 것을 알아낼 것 입니다.

    그러나 RFC 7231에서 암시하는 의도 된 방식, 즉 후속 DELETE에서 404를 반환하는 것은 처음에는 문제가되지 않아야한다는 점을 지적하고 싶습니다. 3 배 더 많은 개발자가 그렇게 선택했으며, 404를 처리 할 수없는 클라이언트로 인해 발생하는 중대한 사건이나 불만을들은 적이 있습니까? 아마도, 아니요, 그 이유는 HTTP DELETE (또는 그 문제에 대한 모든 HTTP 메서드)를 구현하는 괜찮은 클라이언트가 결과가 항상 성공할 것이라고 맹목적으로 가정하지 않기 때문입니다. 그런 다음 개발자가 오류 처리를 고려하기 시작하면 404 Not Found가 가장 먼저 떠오르는 오류 중 하나입니다. 이 시점에서 그는 아마도 HTTP DELETE 작업이 404 오류를 무시하는 것이 의미 상 안전하다는 결론을 내릴 것입니다. 그리고 그들은 그렇게했습니다.

문제 해결됨.


2
+1 "멱등 성은 서버에 미치는 영향에 관한 것입니다." 꼼꼼하게 대답했습니다. 잘 했어! 나는 후속 DELETE 요청에 대한 404 신자입니다.
nwayve

11

첫 번째 삭제 : 200 또는 204.

후속 DELETE : 200 또는 204.

근거 : DELETE는 멱등 적이어야합니다. 두 번째 DELETE에서 404를 반환하면 응답이 성공 코드 에서 오류 코드로 변경 됩니다. 클라이언트 프로그램은 DELETE가 실패했다고 가정하여 잘못된 작업을 수행 할 수 있습니다.

:

  • DELETE 작업이 클라이언트 프로그램에 의해 실행되는 다단계 작업 (또는 "saga")의 일부라고 가정합니다.
  • 클라이언트 프로그램은 예를 들어 은행 거래를 수행하는 모바일 앱일 수있다.
  • 클라이언트 프로그램이 DELETE 작업에 대한 자동 재 시도를한다고 가정 해 봅시다 (DELETE가 멱 등성을 가져야하기 때문에 의미가 있습니다).
  • 첫 번째 DELETE가 성공적으로 실행되었지만 200 응답이 클라이언트 프로그램으로가는 도중에 손실되었다고 가정 해 보겠습니다.
  • 클라이언트 프로그램은 DELETE를 재 시도합니다.
  • 두 번째 시도에서 404가 반환되면 클라이언트 프로그램이이 오류 코드로 인해 전체 작업을 취소 할 수 있습니다.
  • 그러나 첫 번째 DELETE가 서버에서 성공적으로 실행 되었기 때문에 시스템이 일관되지 않은 상태로 남아있을 수 있습니다 .
  • 두 번째 시도가 200 또는 204를 반환하면 클라이언트 프로그램이 예상대로 진행됩니다.

이 접근 방식의 사용을 설명하기 위해 PayPal 용 HTTP API 스타일 가이드 에는 다음과 같은 가이드 라인이 있습니다.

DELETE : 요청이 리소스를 삭제하고 성공적으로 삭제되었으므로 대부분의 경우 콘텐츠를 반환 할 필요가 없기 때문에이 메서드는 상태 코드 204를 반환해야합니다 (SHOULD).

DELETE 메서드도 멱 등성이 있어야하므로 리소스가 이미 삭제 된 경우에도 여전히 204를 반환해야합니다 (SHOULD). 일반적으로 API 소비자는 리소스가이 작업의 일부로 삭제되었는지 또는 이전에 삭제되었는지는 신경 쓰지 않습니다. 이것이 404 대신 204가 반환되어야하는 이유이기도합니다.


1
문제는, 클라이언트에게 중요한 것이 무엇이며, 자원을 삭제 또는 자원이 삭제되었습니다. 다른 클라이언트가 무용담 도중 리소스를 삭제하면 어떻게 될까요? 고객의 목표가 달성되었다고 생각하면 정말로 실패하고 싶습니까?
대럴 밀러

1
@DarrelMiller 좋은 지적입니다. 더 중요한 것은 비즈니스 상황에 따라 다릅니다. 그러나 일반적으로 리소스가 다른 클라이언트에 의해 삭제 된 경우에도 두 번째 DELETE 시도에서 204를 반환합니다. 클라이언트 목표가 달성 되었기 때문에 서비스가 실패 (예 : 404)되는 것을 원하지 않습니다.
Paulo Merson

2
다른 사람들이 언급했듯이 멱등 성은 응답 코드가 아니라 서버 상태입니다.
Niranjan

@Niranjan 멱 등성이 서버 상태에 관한 것임을 동의하지만 다른 응답 코드로 인해 진행중인 사가를 취소하여 클라이언트가 불필요하게 서버 상태를 변경할 수 있습니다.
Paulo Merson 2018 년

@Paulo Merson 클라이언트가 존재하지 않는 항목의 삭제를 요청하면 어떤 코드를 반환합니까? 204? 또는 404? 항상 204를 반환하면 반환 코드를 확인하는 요점이 무엇입니까?
frenchone
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.