REST DELETE는 실제로 dem 등성입니까?


165

DELETE는 dem 등원이어야합니다.

내가 삭제하면 http://example.com/account/123을 이 계정을 삭제하는 것입니다.

계정을 더 이상 존재하지 않기 때문에 다시 404를 사용할 수 있습니까? 존재하지 않는 계정을 삭제하려고하면 어떻게합니까?


11
답변 외에도 일반적으로 dem 등원 특성에 너무 집중하지 말 것을 제안합니다 : 그것은 commutativity 및 동시 요청에 대해 아무 말도하지 않습니다. 예를 들어, 동일한 "R1"PUT 요청의 N + 1은 동일한 효과를 가져야하지만 다른 클라이언트가 사용자간에 서로 다른 PUT / DELETE "R2"요청을했는지 알 수 없으므로 n R1 = R1 및 m R2 = R2, "R1"및 "R2"요청이 인터리브 된 경우 단일 클라이언트의 관점 만 취하면 반드시 look 등식이 될 필요는 없습니다.
브루노

답변:


188

Idempotence는 요청이 완료된 후 시스템 상태를 나타냅니다.


모든 경우 (오류 문제 제외-아래 참조) 계정이 더 이상 존재하지 않습니다.

에서 여기

"방법은 또한 오류나 만료 문제를 제외하고 N> 0 개의 동일한 요청의 부작용이 단일 요청의 부작용과 동일하다는 점에서"등가성 "의 속성을 가질 수 있습니다 . GET, HEAD, PUT 및 DELETE 메소드 또한 OPTIONS 및 TRACE 메소드는 부작용이 없어야하며 따라서 본질적으로 dem 등원입니다. "


N> 0 동일한 요청의 부작용 이있는 키 비트 는 단일 요청의 경우와 동일합니다.

상태 코드가 다를 것으로 예상하지만 이것이 dem 등원핵심 개념 에는 영향을 미치지 않습니다 . 서버 상태를 추가로 변경하지 않고 요청을 두 번 이상 보낼 수 있습니다.


3
부작용! == 서버 상태
wprl

2
@wprl이 "부작용"이 실제로 무엇인지에 대한 논쟁이 있습니다. "서버 상태"이거나 클라이언트에게 응답이 전송 될 수 있습니다. leedavis81.github.io/is-a-http-delete-requests-idempotent
Alireza

다음은 두 번째 DELETE의 404가 실제로 서버의 상태를 변경할 수 있다는 주장입니다. stackoverflow.com/a/45194747/317522
Paulo Merson

1
@PauloMerson 감사합니다. 개인적으로 두 번째 수익이 404 또는 200인지 여부는 중요하지 않다고 생각합니다. 서버의 상태가 변경되지 않았기 때문에 만족합니다.
Chris McCauley

46

dem 등원 은 요청 응답 코드가 아니라 요청의 영향에 관한 것입니다.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2 는 다음과 같이 말합니다.

또한 메소드는 "오류 또는 만료 문제를 제외하고"N> 0 개의 동일한 요청의 부작용이 단일 요청의 부작용과 동일하다는 점에서 "등가"속성을 가질 수 있습니다.

다른 응답 코드를 얻을 수 있지만 N + 1 DELETE 요청을 동일한 자원으로 보내는 효과 는 동일한 것으로 간주 될 수 있습니다.


13

중요한 차이점은 dem 등식은 모든 영향 이나 반응이 아니라 부작용을 의미한다는 것 입니다. 그렇게하면 계정 123이 서버에서 삭제됩니다. 이것이 유일하고 유일한 효과이며 유일하게 서버 상태로 변경 됩니다. 이제 동일한 요청을 다시 수행한다고 가정하면 서버가 다르게 응답하지만 상태는 동일합니다.DELETE http://example.com/account/123DELETE http://example.com/account/123

다른 계정을 제거하거나 오류 로그를 남기는 등 계정이 없기 때문에 DELETE 요청이 다른 방식으로 서버 상태를 변경하기로 결정한 것과 다릅니다. 네, 같은 DELETE 요청을 백만 번 호출 할 수 있으며 서버가 처음 호출 한 상태와 동일한 상태인지 확인할 수 있습니다 .


7

로부터 HTTP의 RFC :

또한 메소드는 "오류 또는 만료 문제를 제외하고"N> 0 개의 동일한 요청의 부작용이 단일 요청의 부작용과 동일하다는 점에서 "등가"속성을 가질 수 있습니다.

"응답"이 아니라 "부작용"입니다.


7

예. 응답 코드에 관계없이

에서 HTTP 1.1에 대한 최신 RFC (강조 광산) :

클라이언트가 서버의 응답을 읽기 전에 통신 실패가 발생하면 요청이 자동으로 반복 될 수 있기 때문에 dem 등원 한 방법이 구별됩니다. 예를 들어, 클라이언트가 PUT 요청을 보내고 응답이 수신되기 전에 기본 연결이 닫히면 클라이언트는 새 연결을 설정하고 dem 등원 (Idempotent) 요청을 다시 시도 할 수 있습니다. 응답이 다를 수 있지만 원래 요청이 성공하더라도 요청을 반복하면 의도 한 효과가 동일하다는 것을 알고 있습니다.

응답이 다를 수 있다고 명시되어 있습니다. 더 중요한 것은, 개념의 이유를 지적합니다. 액션이 dem 등원 인 경우, 클라이언트는 에러가 발생했을 때 액션을 반복 할 수 있으며, 그렇게함으로써 아무 것도 충돌하지 않음을 알고 있습니다. 그렇지 않은 경우 클라이언트는 GET작업을 안전하게 반복하기 전에 이전 쿼리 가 효과적인지 확인하기 위해 추가 쿼리를 작성해야합니다 ( ). 서버가 그러한 보증을 할 수있는 한, 조치는 dem 등원입니다. 다른 의견 에서 인용 :

i 등식 컴퓨팅 은 시스템의 견고성에 관한 것입니다. 장애가 발생하면 (예 : 네트워크 중단) 장애가 감지되면 어떻게 복구합니까? 가장 쉬운 복구는 다시 수행하는 것이지만 다시 수행하는 것이 dem 등원 인 경우에만 작동합니다. 예를 들어 discard(x)dem 등원이지만 pop()그렇지 않습니다. 모든 것이 오류 복구에 관한 것입니다.


2

같은 생각, 404-계정이 존재하지 않습니다.

400-나쁜 요청이라고 주장 할 수 있습니다. 그러나 REST의 의미에서 조치를 수행하도록 요청한 오브젝트가 존재하지 않습니다. 404로 번역됩니다.


1
400을 생성하려면 객체가 존재했음을 알아야합니다. 이는 매우 불안합니다.
annakata

1
@annakata, 400은 존재했던 리소스 (아마도 410 / Gone을 염두에두고 있음)가 아니라 잘못된 요청 에 대한 것입니다. "잘못된 구문으로 인해 서버에서 요청을 이해할 수 없습니다."
브루노

3
@Bruno-OP의 의미를 알고 있습니다.
annakata

1
200은 괜찮을 것 같아요. 서버 상태가 계정이 사라진 상태가 되길 원합니다. 어떤 요청이 실제로 사라 졌는지가 중요합니까? 여전히 두 번째 요청으로 진행되었으며 서버 상태는 변경되지 않았습니다.
Andy

1

다른 대답 에서 인용했습니다 :

역사적으로 1999 년에 출판 된 RFC 2616은 가장 많이 참조되는 HTTP 1.1 사양이었습니다. 불행하게도 , dem 등성에 대한 설명은 모호해서 ,이 모든 논쟁의 여지가 남아 있습니다. 그러나이 사양은 RFC 7231에 의해 대체되었습니다. RFC 7231, 4.2.2 절등 법 (Idempotent Methods) 섹션 에서 발췌 :

요청 방법은 해당 방법으로 여러 동일한 요청의 서버에 대한 의도 된 효과가 단일 요청에 대한 효과와 동일한 경우 "등분 성"으로 간주됩니다. 이 스펙에 의해 정의 된 요청 메소드 중 PUT, DELETE 및 안전한 요청 메소드 는 dem 등원 입니다.

그래서 그것은 스펙에 쓰여졌 고, dem 등성은 서버에 미치는 영향에 관한 것입니다. 첫 번째 DELETE가 204를 반환 한 다음 DELETE가 404를 반환하면 이러한 다른 상태 코드는 DELETE를 비등 전성으로 만들지 않습니다. 이 인수를 사용하여 후속 204 리턴을 정당화하는 것은 단순히 관련이 없습니다.


i 등성에 관한 것이 아닙니다. 그러나 후속 질문은 다음 DELETE에서 204를 계속 사용하면 어떻게 될까요? 괜찮습니까?

좋은 질문. 동기 부여는 이해할 수 있습니다. 오류 처리에 대한 걱정없이 클라이언트가 의도 한 결과에 도달 할 수 있도록합니다. 차후 DELETE에서 204를 반환하는 것은 클라이언트 측이 즉시 차이점을 알려주지 않는 서버 측 "백색 거짓말"이라고해도 무해합니다. 그래서 사람들은 야생에서 그렇게하고 여전히 작동합니다. "GET / non-exist"는 404를 반환하지만 "DELETE / non-exist"는 204를 제공하기 때문에 이러한 거짓말은 의미 상 이상하다고 간주 될 수 있습니다. 섹션 6.5.4 404 찾을 수 없음 .

그러나 RFC 7231에 의해 암시 된 의도 된 방법, 즉 후속 DELETE에서 404를 반환하는 것은 처음에는 문제가되지 않습니다. 더 많은 개발자들이 그렇게하기로 결정했습니다. 아마도 HTTP DELETE를 구현하는 클라이언트 (또는 그 문제에 대한 모든 HTTP 메소드)가 결과가 항상 2xx에 성공한다고 맹목적으로 가정하지 않기 때문일 것입니다. 그런 다음 개발자가 오류 처리를 고려하기 시작하면 404 Not Found가 가장 먼저 발생하는 오류 중 하나입니다. 이 시점에서 HTTP DELETE 작업이 404 오류를 무시하는 것이 의미 적으로 안전하다는 결론을 내릴 수 있기를 바랍니다. 문제 해결됨.

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