PATCH 방법이 i 등성이 아닌 이유는 무엇입니까?


48

나는 이것에 대해 궁금했다.

에 및 필드 가있는 user리소스 가 있다고 가정 합니다. 필드를 업데이트하려면 다음과 같이 리소스에 PATCH 요청을 할 수 있습니다.idname

PATCH /users/42
{"name": "john doe"} 

그런 다음 응용 프로그램은 사용자 42 이름을 업데이트합니다.

그러나 왜이 요청을 반복하면 결과가 달라 집니까?

RFC 5789 에 따르면

패치는 안전하거나 dem 등하 지 않습니다


호출간에 다른 누군가가 사용자 업데이트 요청을하는 경우 어떻게해야합니까? 42{"name": "bendjamin franklin"}
gnat

@gnat은 대신 dem 등원으로 간주되는 PUT 메소드에 대해서도 유사한 인수를 보유하지 않습니까? ( goo.gl/t24ZSJ 참조 )
mattecapu

"PUT은 dem 등원 (imdempotent) 시맨틱을 가지므로 절대 업데이트 (예 : 자원의 전체 상태를 서버로 전송)에도 안전하게 사용할 수 있지만 상대 업데이트 (예 : 자원 상태로 변경 사항 만 전송) 에도 위반할 수 있습니다. 그것의 의미론 ... "( POST 및 PUT 요청 – 그냥 컨벤션입니까? )
gnat

1
분명히 ...하지만 두 개의 동일한 요청 사이에서 두 번째 클라이언트가 두 개의 요청 사이에 세 번째 요청을 할 수 있기 때문에 PUT이 dem 등성이 아니라고 말할 수 있습니다. 그러나 이전 데이터에 대해서는 신경 쓰지 않기 때문에 문제가되지 않습니다. PATCH 요청에 대해 동일한 인수가 유지됩니다.
mattecapu

2
나는이 질문의 맥락에서 매우 관련성이 있다고 생각하기 때문에 관련 사양에 대한 참조를 추가 할 자유를 얻었습니다.
Pete

답변:


34

PATCH 요청 dem 등원 일 수 있지만 반드시 그럴 필요는 없습니다. 이것이 비등 전성으로 특징 지워지는 이유입니다.

PATCH가 dem 등원 일 수 있는지의 여부는 필요한 변경 사항을 전달하는 방법에 따라 다릅니다.
예를 들어, 패치 형식이의 형식 인 {change: 'Name' from: 'benjamin franklin' to: 'john doe'}경우 첫 번째 요청 이후의 PATCH 요청은 첫 번째 요청과 다른 영향 (실패 응답)을 갖습니다.
비 등가성에 대한 또 다른 이유는 원래 자원 이외의 다른 것에 수정을 적용하면 자원이 유효하지 않게 될 수 있기 때문입니다. 변경 사항을 여러 번 적용하는 경우에도 마찬가지입니다.


3
마지막 단락을 이해하지 못합니다. "원본 리소스 이외의 다른 항목에 수정 사항을 적용하여 리소스를 무효화 할 수있는 방법"과 동일한 리소스에 여러 번 변경 사항을 적용하는 방법에 대한 예를들 수 있습니까?
Robin Green

3
@RobinGreen : 자원이 최대 하나의 <name>요소 가 있어야하는 XML로 표현되었다고 가정하십시오 . PATCH가 <name>원래 요소를 포함하지 않은 자원에 요소를 추가하는 경우 PATCH를 두 번 적용하거나 이미을 포함하는 자원에 적용 <name>하면 자원이 유효하지 않게됩니다. 갑자기 <name>허용되지 않는 두 개의 요소가 포함되기 때문입니다. 그런 자원을 위해.
Bart van Ingen Schenau

13
첫 번째 예는 IM 등수이므로 IMHO와 관련이 없습니다. dem 등원 인 DELETE를 사용한 예, 첫 번째 요청 : 자원이 존재하지만 삭제되었습니다 (2xx를 리턴 함), 두 번째 요청 : 자원이 존재하지 않고 요청 후에도 존재하지 않으면 4xx를 리턴합니다. 서버 상태는 변경되지 않았으므로 dem 등원입니다. 예를 들어, 첫 번째 요청 : BenFra에서 JohDoe로 PATCH, 자원 이름은 BenFra이지만 이제는 JohDoe (2xx 리턴), 두 번째 요청 : BenFra에서 JohDoe로 PATCH, 자원 이름은 JohDoe이며 여전히 JohDoe (4xx)입니다. 따라서 이것은 PATCH가 nonidempotent 일 수 있음을 보여주지 않습니다.
sp00m

자세한 내용은 여기 : stackoverflow.com/q/4088350/1225328
sp00m

7

나는 i 등성이 아닌 PATCH가 RFC 5789 의이 단락 일 때 명확한 대답을 생각합니다.

패치 형식이 알려진 기준점 (예 : 텍스트 파일을 로그 파일에 추가하거나 충돌하지 않는 행을 데이터베이스 테이블에 추가)에서 작동 할 필요가없는 경우도 있습니다.이 경우 클라이언트 요청에서 동일한주의가 필요하지 않습니다. .

RFC는 패치에 리소스에 대한 "일반적인 변경 사항"이 포함되어 있다고 명시 했으므로 일반적인 필드 교체 이상의 것을 고려해야합니다. 만약 리소스가 카운터를위한 것이라면, patch는 증가를 요청할 수 있으며, 이는 분명히 idempotet이 아닙니다.


2

PATCH요청은 리소스에 적용 할 작업 집합을 설명합니다. 동일한 작업 집합을 동일한 리소스에 두 번 적용하면 결과가 동일하지 않을 수 있습니다. 작업 정의는 사용자에게 달려 있기 때문입니다. 다시 말해서 병합 규칙 을 정의해야합니다 .

기억 PATCH요청은 다양한 형식뿐 아니라 JSON 자원을 패치에 사용될 수 있습니다.

따라서 병합 규칙을 dem 등원으로 정의하면PATCH 요청이 dem 등원 수 있습니다 .

dem 등한 예 :

// Original resource
{
  name: 'Tito',
  age: 32
}

// PATCH request
{
  age: 33
}

// New resource
{
  name: 'Tito',
  age: 33
}

비등 전성 예 :

// Original resource
{
  name: 'Tito',
  age: 32
}

// PATCH request
{
  $increment: 'age'
}

// New resource
{
  name: 'Tito',
  age: 33
}

두 번째 예에서는 속성을 증가시키기 위해 만든 "Mongo like"구문을 사용했습니다. 동일한 요청을 여러 번 보내면 매번 다른 결과가 나올 것이기 때문에 이것은 분명히 dem 등성이 아닙니다.

이제 이러한 구성 구문을 사용할 수 있는지 궁금 할 것입니다. 표준 에 따르면 다음과 같습니다.

PUT 요청과 PATCH 요청의 차이점은 서버가 동봉 된 엔터티를 처리하여 Request-URI로 식별되는 리소스를 수정하는 방식에 반영됩니다. PUT 요청에서 동봉 된 엔터티는 원본 서버에 저장된 수정 된 버전의 리소스로 간주되며 클라이언트는 저장된 버전의 교체를 요청합니다. 그러나 PATCH를 사용하면 동봉 된 엔터티에 현재 원본 서버에있는 리소스를 수정하여 새 버전을 생성하는 방법을 설명하는 지침 세트가 포함됩니다.

또한 이 방법으로 요청 을 사용 하는 것이 편안한 지 궁금 할 수도 있습니다. PATCH많은 사람들은 그렇지 않다고 생각 합니다.이 문제에 대한 많은 의견을 가진 좋은 대답 이 있습니다.

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