2013-12-12 2 views
9

변경할 수있는 속성 집합 및 변경 불가능한 서비스 집합 (예 : status은 서비스에서 생성되며 클라이언트가 변경할 수없는 집합)이있는이 서비스의 리소스를 디자인하기 위해 노력하고 있습니다.RESTful 서비스는 변경 가능한 리소스에 읽기 전용 속성을 어떻게 표시해야합니까?

GET 리소스 요청에 대한 응답에 이것을 포함해야하지만 누군가가 PUT 요청 리소스를 보내는 경우 어떻게해야할지 잘 모릅니다.

호출자가 어떤 속성이 불변인지 알도록 강요하지만 자동으로 업데이트를 버리는 것은 잘못된 것으로 느낍니다. PUT 요청에 대한 업데이트 된 리소스로 응답하면 문제가 해결 될 수 있지만 속성이 승인되었는지 여부를 확인하기 위해 발신자가 요청과 서비스의 응답을 비교할 필요가 없으므로 불완전합니다.

앞으로 나아갈 생각이 있으십니까?

P. How should I update a REST resource?을 보았지만이 질문과 다른 점이 많고 지나치게 수다스러운 API 디자인을 권장합니다.

답변

6

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.10의 가이드 라인을 따르는 것이 좋습니다. HTTP 409의 정의에는 다음이 포함됩니다.

1) 자원의 현재 상태와 충돌하여 요청을 완료 할 수 없습니다.

2) 응답 본문에는 사용자가 충돌 소스를 인식 할 수있는 충분한 정보가 포함되어야합니다 (SHOULD).

따라서 변경 불가능한 속성의 변경 사항은 리소스 상태에 문제가 있으므로 HTTP 409가 적용되는 것으로 보입니다.

고객에게 문제를 전달하는 방법에 대한 지침은 응답 본문에 세부 정보를 포함하는 것 같습니다.

또한 GET에서 표현 자체에서 속성의 변경 가능성을 전달할 수 있습니다. 예를 들어.

+0

나는 이것이 아마도 움직이는 방법이라고 생각합니다. 만약 그들이 불변 속성을 변경하려한다면 그것은 409입니다. 그들이 그것을 내버려두면 우리는 그것들을 받아 들여 그것을 조용히 버립니다. 최종 상태는 예상과 일치하며 속성은 읽기 전용 상태로 유지됩니다. – ehdv

2

API의 응답을 설계하여 읽기 전용 속성이 실제로 변경 가능한 속성과 분리되도록 할 수 있습니다. 예를 들면 다음과 같습니다.

이 작업을 수행하는 API는 모두 작성 및 사용했으며 제대로 작동합니다.

+5

나는 재산의 특성을 계층에 넣기 때문에이 접근법에 대해 염려 할 것입니다. 또한 자원의 일부가 어떤 이유로 일시적으로 잠긴 경우와 같이 변경 가능성이 변경 될 수 있습니다. – ehdv

1

JSON-Patch 문서와 함께 HTTP PATCH를 사용하면 수정하려는 속성을 정확하게 정확히 집어 넣을 수 있습니다. http://tools.ietf.org/html/rfc6902을 참조하십시오.

하지만 불변 및 변경 가능 요소를 모두 PUT하는 데는 아무런 문제가 없습니다. 서버는 변경하기를 원하지 않는 것을 자유롭게 무시할 수 있습니다. 이 주제에 대한 심층적 인 토론을 여기에 썼습니다 : http://soabits.blogspot.dk/2013/01/http-put-patch-or-post-partial-updates.html

+1

_ "[HTTP PATCH]를 사용하면 수정하려는 속성을 정확히 정확하게 집어 넣을 수 있습니다."_ 물론, 클라이언트가 수정 가능한 속성과 그렇지 않은 속성을 알 수는 없지만 실제로 생각하지 않습니다. 블로그 게시물은 변경하고 싶지 않은 내용을 무시하는 것이 중요하다는 강력한 주장을 제기합니다. 나는 네가 틀렸다고 말하는 것이 아니며, 단지 네가 어떤 주장을 정당화하지 않았다고 생각한다. –

+0

패치 자체는 클라이언트에게 수정할 수있는 필드를 알려주지 않습니다. 이것은 초기 표현에서 하이퍼 미디어 요소를 필요로 할 것이다 : 어떤 필드가 불변이고 어떤 것은 불변인지를 설명하는 "form"요소. 런타임시 변경 불가능한 필드 집합이 변경되면 이는 내가 볼 수있는 유일한 해결책입니다. 변경할 수없는 필드 집합이 고정되어 있으면 해당 지식으로 하드 코딩 된 클라이언트에 아무런 문제가 나타나지 않습니다. 그러나 더 큰 규모에서는 하이퍼 미디어가 필요합니다. 이렇게하면 클라이언트 - 서버 커플 링이 느슨해지며 클라이언트가 중단되지 않고 서버가 시간이 지남에 따라 발전 할 수 있습니다. –

+0

그리고 우리가 응답에 하이퍼 미디어 요소를 추가하면 모든 것을 PUT하는 것이 더 이상하게됩니다. 내 말은, 요소를 폼 (및 링크) 요소가 서버로 돌려 보내야한다는 것입니다 (확실히 불변). 내가 주장하는 것은 PATCH (x-www-form-urlencoded 키/값 쌍 또는 JSON이있는 전통적인 POST뿐만 아니라, 블로그 게시물에서 논한 바와 같이 NULL 처리가 문제가된다)입니다. –