REST 인터페이스를 통해 VM 종료
이것은 실제로 2009 년 Tim Bray 가 제시 한 다소 유명한 예 입니다.
로이 필딩 (Roy Fielding)은 문제를 논의하면서이 관찰을 공유했다 .
개인적으로 모니터링되는 상태 (예 : 전원 상태)를 편집 할 수없는 시스템으로 선호합니다.
요컨대, 모니터 된 상태의 현재 표시를 리턴하는 하나의 정보 자원이 있습니다. 해당 표현에는 해당 상태에 대한 변경을 요청 하는 양식에 대한 하이퍼 미디어 링크가 포함될 수 있으며 양식에는 각 변경 요청을 처리 할 자원에 대한 다른 링크가 있습니다.
세스 래드 는 문제에 대한 핵심 통찰력을 가지고있었습니다
우리는 달리는 사람의 단순한 상태에서 생성, 업데이트 및 이야기 할 수있는 진정한 명사로 전환했습니다.
이것을 다시 컴퓨터 재부팅으로 가져갑니다. 나는 당신이 POST 것이라고 주장 할 것이다 / VDC / 434 / 클러스터 / 4894 / 서버 / 4343 / 재부팅 당신이 게시 한 후에는 나타내는 URI가 이 재부팅하고 상태 업데이트를 얻을 수 있습니다. 하이퍼 링크의 마법을 통해 재부팅 표시는 재부팅 된 서버에 연결됩니다.
유감 URI 공간은 저렴하고 URI는 훨씬 저렴하다고 생각합니다. 명사로 모델링 된 활동 콜렉션을 작성하고 POST, PUT 및 DELETE를 수행하십시오!
RESTful 프로그래밍은 웹 규모의 Vogon 관료주의입니다. 당신은 어떻게해야합니까 아무것도 편안하고 있습니까? 새로운 서류를 발명하고 서류를 디지털화하십시오.
좀 더 멋진 언어로, 당신이하고있는 일은 "VM 종료"를위한 도메인 애플리케이션 프로토콜 을 정의하고 그 프로토콜을 노출 / 구현하는데 필요한 리소스를 식별하는 것입니다.
자신의 예를 보면
PATCH /api/virtualmachines/42
Content-Type:application/json
{ "state": "shutting down" }
괜찮아; 실제로 요청 자체를 별도의 정보 리소스로 취급하지는 않지만 여전히 관리 할 수는 있습니다.
당신은 변화의 표현에서 약간을 놓쳤다.
그러나 PATCH를 사용하면 동봉 된 엔터티에 현재 원본 서버에있는 리소스를 수정하여 새 버전을 생성하는 방법을 설명하는 지침 세트가 포함됩니다.
예를 들어 JSON 패치 미디어 유형은 JSON 문서를 직접 수정하는 것처럼 지시 사항을 형식화합니다.
[
{ "op": "replace", "path": "state", "value": "shutting down" }
]
대안으로, 아이디어는 가깝지만 분명히 정확하지는 않습니다. PUT
는 대상 URL 의 리소스 상태를 완전히 대체 하므로 단일 엔티티 의 표현 대상으로 모음 처럼 보이는 철자를 선택하지 않을 것입니다 .
POST /api/virtualmachines/42/actions
대기열에 작업을 추가한다는 허구와 일치
PUT /api/virtualmachines/42/latestAction
큐의 테일 항목을 업데이트한다는 허구와 일치합니다. 이런 식으로하는 것이 조금 이상합니다. 최소한의 놀람 원칙은 각 PUT에 한곳에 모두 배치하고 동시에 여러 리소스를 수정하는 대신 고유 한 식별자를 부여하는 것이 좋습니다.
URI의 철자를 설명하는 한 REST는 신경 쓰지 않습니다. /cc719e3a-c772-48ee-b0e6-09b4e7abbf8b
REST에 관한 한 완벽하게 cromulent URI입니다. 변수 이름과 마찬가지로 가독성은 별도의 관심사입니다. 와 일치하는 철자를 사용하여 RFC 3986을 만들 것입니다 사람들이 많은 행복.
CQRS
여러 집계를 업데이트하거나 구체적 자원 및 하위 자원에 대한 CRUD 오퍼레이션에 맵핑 할 수없는 많은 "조치"(일명 명령)가있는 CQRS 도메인이있는 경우 어떻게됩니까?
CQRS의 Greg Young
CQRS는 존재하지 않을 수있는 아키텍처에 대한 많은 기회를 가능하게하는 매우 간단한 패턴입니다. CQRS는 최종 일관성이 아니며, 이벤트가 아니며, 메시징이 아니며, 읽기 및 쓰기를위한 별도의 모델이 없으며, 이벤트 소싱을 사용하지도 않습니다.
대부분의 사람들이 CQRS에 대해 이야기 할 때 실제로 응용 프로그램의 서비스 경계를 나타내는 개체에 CQRS 패턴을 적용하는 것에 대해 말합니다.
HTTP / REST의 맥락에서 CQRS에 대해 이야기하고 있다고 가정하면, 후자의 맥락에서 작업하고 있다고 가정하는 것이 합리적입니다.
놀랍게도 이것은 이전 예보다 훨씬 쉽습니다. 그 이유는 간단합니다. 명령은 메시지 입니다.
Jim Webber 는 HTTP를 1950 년대 사무실의 애플리케이션 프로토콜로 설명합니다. 메시지를 받아받은 편지함에 넣어서 작업이 완료됩니다. 같은 아이디어가 있습니다-양식의 빈 사본을 가져 와서 우리가 알고있는 내용으로 채우고 전달하십시오. 타 다
가능한 한 구체적 자원에 대해 구체적 명령을 작성하거나 업데이트하는 것 (예제 I의 첫 번째 접근법에 따름)만큼 많은 명령을 모델링하고 나머지는 "작업 종점"을 사용해야합니까?
예. "콘크리트 리소스"가 도메인 모델의 엔터티가 아닌 메시지 인 한 가능합니다.
핵심 아이디어 : REST API는 여전히 인터페이스입니다 . 클라이언트가 메시지를 변경할 필요없이 기본 모델을 변경할 수 있어야합니다. 새 모델을 릴리스하면 도메인 프로토콜을 가져 와서 새 모델에 적용하는 방법을 알고있는 웹 엔드 포인트의 새 버전을 릴리스합니다.
CQRS 모델이 RPC 유사 API에 더 적합합니까?
실제로는 아닙니다. 특히 웹 캐시는 "최종적으로 일관된 읽기 모델"의 좋은 예입니다. 각각의 캐싱 규칙을 사용하여 각각의보기를 독립적으로 처리 할 수있게하면 무료로 다양한 확장이 가능합니다. 읽기 전용 RPC 접근 방식에는 상대적으로 호소력이 없습니다.
쓰기의 경우 까다로운 질문입니다. 모든 명령을 단일 엔드 포인트 또는 단일 엔드 포인트 제품군의 단일 핸들러로 보내는 것이 훨씬 쉽습니다 . REST는 실제로 엔드 포인트가 클라이언트와 통신하는 위치를 찾는 방법에 대한 것입니다.
메시지를 고유 한 리소스로 취급하면 PUT을 사용할 수 있다는 장점이 있으며 중간 구성 요소에 메시지 처리가 dem 등이므로 특정 오류 처리에 참여할 수 있다는 사실을 알려줍니다. . (참고 : 클라이언트의 관점에서 볼 때 자원이 다른 URI를 가진 경우 자원이 다릅니다. 원본 서버에서 모두 동일한 요청 처리기 코드를 가질 수 있다는 사실은 유니폼에 의해 숨겨진 구현 세부 사항입니다. 인터페이스).
수비 (2008)
또한 위의 용어는 아직 완전히 RESTful하지는 않지만 적어도 용어를 사용하는 방법에 유의하십시오. 내가 한 모든 서비스 인터페이스는 RPC에 지나지 않습니다. RESTful하게하려면 서비스를 소개하고 정의하기 위해 하이퍼 텍스트를 추가하고, 양식 및 / 또는 링크 템플릿을 사용하여 매핑을 수행하는 방법을 설명하고, 시각화를 유용한 방식으로 결합하는 코드를 제공해야합니다.