pot 효능
RFC에 이어 PUT은 리소스에 전체 개체를 제공해야합니다. 이것의 주된 이유는 PUT이 dem 등원이어야하기 때문입니다. 이는 요청이 서버에서 동일한 결과로 평가되어야한다는 것을 의미합니다.
부분 업데이트를 허용하면 더 이상 강력한 업데이트가 될 수 없습니다. 두 명의 고객이있는 경우 클라이언트 A와 B는 다음 시나리오로 발전 할 수 있습니다.
클라이언트 A는 리소스 이미지에서 사진을 가져옵니다. 여기에는 이미지에 대한 설명이 포함되며 여전히 유효합니다. 클라이언트 B는 새로운 이미지를 넣고 그에 따라 설명을 업데이트합니다. 사진이 변경되었습니다. 고객 A는 자신이 원하는대로 이미지를 설명하기 때문에 설명을 변경할 필요가 없습니다.
이로 인해 불일치가 발생하고 이미지에 잘못된 메타 데이터가 첨부되었습니다!
더 성가신 것은 모든 중개자가 요청을 반복 할 수 있다는 것입니다. 어떻게 든 PUT이 실패했는지 결정합니다.
PUT의 의미는 변경할 수 없습니다 (오용 할 수는 있지만).
다른 옵션
운 좋게 또 다른 옵션이 있습니다. 이것은 PATCH입니다. PATCH는 구조를 부분적으로 업데이트 할 수있는 방법입니다. 단순히 부분 구조를 보낼 수 있습니다. 간단한 응용 프로그램의 경우 문제가 없습니다. 이 방법이 반드시 강력한 것은 아닙니다. 클라이언트는 다음 형식으로 요청을 보내야합니다.
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
그리고 서버는 성공을 알리기 위해 204 (콘텐츠 없음)로 회신 할 수 있습니다. 오류가 발생하면 구조의 일부를 업데이트 할 수 없습니다. PATCH 방법은 원 자성입니다.
이 방법의 단점은 모든 브라우저가이를 지원하지는 않지만 REST 서비스에서 가장 자연스러운 옵션이라는 것입니다.
패치 요청 예 :
http://tools.ietf.org/html/rfc5789#section-2.1
JSON 패치
json 옵션은 매우 포괄적이며 흥미로운 옵션입니다. 그러나 제 3자를 위해 구현하기가 어려울 수 있습니다. 사용자 기반이이를 처리 할 수 있는지 결정해야합니다.
또한 명령을 부분 구조로 변환하는 작은 인터프리터를 빌드해야하기 때문에 다소 복잡합니다. 모델을 업데이트하는 데 사용할 것입니다. 이 명령은 제공된 명령이 의미가 있는지 확인해야합니다. 일부 명령은 서로를 취소합니다. (필드 작성, 필드 삭제). 클라이언트 측에 디버그 시간을 제한하기 위해 이것을 클라이언트에 다시보고하고 싶다고 생각합니다.
그러나 시간이 있다면 이것은 정말 우아한 해결책입니다. 물론 필드의 유효성을 검사해야합니다. 이것을 PATCH 메소드와 결합하여 REST 모델에 머무를 수 있습니다. 그러나 POST는 여기에 적합 할 것이라고 생각합니다.
나쁜가
PUT 옵션을 사용하기로 결정한 경우 다소 위험합니다. 그런 다음 최소한 오류를 버리지 않아야합니다. 사용자에게는 일정한 기대치가 있으며 (데이터가 업데이트 됨)이 문제를 해결하면 일부 개발자에게 좋지 않은 시간을주게됩니다.
409 충돌 또는 403 금지로 플래그를 다시 지정할 수 있습니다. 업데이트 프로세스를 보는 방법에 따라 다릅니다. 규칙 세트 (시스템 중심)로 보면 충돌이 더 좋아질 것입니다. 이러한 필드는 업데이트 할 수 없습니다. (규칙과 충돌). 인증 문제 (사용자 중심)로 보이면 금지 된 것으로 반환해야합니다. 포함 :이 필드를 변경할 권한이 없습니다.
여전히 사용자가 수정 가능한 모든 필드를 보내도록해야합니다.
이를 적용하는 합리적인 옵션은 수정 가능한 데이터 만 제공하는 하위 리소스로 설정하는 것입니다.
개인적인 의견
개인적으로 간단한 패치 모델을 사용하고 (브라우저를 사용할 필요가 없다면) 나중에 JSON 패치 프로세서로 확장합니다. 이것은 mimetypes를 차별화하여 수행 할 수 있습니다 : mime type of json patch :
응용 프로그램 / json-patch
그리고 json : application / json-patch
두 단계로 쉽게 구현할 수 있습니다.