우선 돈을 송금하는 것은 단일 자원 통화로는 할 수없는 일입니다. 당신이하고 싶은 행동은 돈을 보내는 것입니다. 따라서 송금 자 계정에 송금 리소스를 추가하십시오.
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
끝난. 당신은 이것이 원자 적이어야하는 거래라는 것을 알 필요가 없습니다. 당신은 일명 돈을 이체합니다. A에서 B로 송금
그러나 드문 경우이지만 일반적인 해결책은 다음과 같습니다.
정의 된 컨텍스트에서 많은 자원을 포함하는 매우 복잡한 작업을 수행하려는 경우 실제로 장벽 (비즈니스와 구현 지식에 대한 장벽)을 넘어서는 많은 제한이 있으므로 상태를 이전해야합니다. REST는 상태가 없어야하므로 클라이언트는 상태를 이전해야합니다.
상태를 전송하면 클라이언트에서 내부 정보를 숨겨야합니다. 고객은 구현에 필요한 내부 정보 만 알아야하며 비즈니스 측면에서 관련된 정보는 가지고 있지 않습니다. 이러한 정보에 비즈니스 가치가없는 경우 상태를 암호화해야하며 토큰, 패스 또는 이와 유사한 은유를 사용해야합니다.
이런 식으로 내부 상태를 전달할 수 있고 암호화를 사용하고 시스템에 서명하면 여전히 안전하고 건전 할 수 있습니다. 클라이언트가 상태 정보를 전달하는 이유에 대한 올바른 추상화를 찾는 것은 설계 및 아키텍처에 달려 있습니다.
실제 솔루션 :
REST는 HTTP를 말하고 HTTP는 쿠키 사용 개념과 함께 제공됩니다. 사람들이 REST API와 여러 리소스 또는 요청에 걸친 워크 플로 및 상호 작용에 대해 이야기 할 때 이러한 쿠키는 종종 잊혀집니다.
HTTP 쿠키에 대해 Wikipedia에 작성된 내용을 기억하십시오.
쿠키는 웹 사이트가 상태 저장 정보 (예 : 장바구니의 항목)를 기억하거나 사용자의 탐색 활동 (특정 단추 클릭, 로그인 또는 사용자가 방문한 페이지 기록 포함)을 기록 할 수있는 신뢰할 수있는 메커니즘으로 설계되었습니다. 몇 달 또는 몇 년 전으로 돌아 왔습니다.
따라서 기본적으로 상태를 전달해야하는 경우 쿠키를 사용하십시오. 정확히 같은 이유로 설계되었으며 HTTP이므로 설계에 따라 REST와 호환됩니다. :).
더 나은 솔루션 :
여러 요청과 관련된 워크 플로를 수행하는 클라이언트에 대해 이야기하는 경우 일반적으로 프로토콜에 대해 이야기합니다. 모든 형태의 프로토콜에는 B를 수행하기 전에 단계 A를 수행하는 것과 같이 각 잠재적 단계에 대한 사전 조건 세트가 제공됩니다.
이것은 자연 스럽지만 클라이언트에 프로토콜을 노출 시키면 모든 것이 더 복잡해집니다. 그것을 피하기 위해 현실 세계에서 복잡한 상호 작용과 일을해야 할 때 우리가하는 일을 생각하십시오 .... 우리는 에이전트를 사용합니다.
상담원 은유를 사용하여 필요한 모든 단계를 수행하고 실제 할당 / 명령을 목록에 저장할 수있는 리소스를 제공 할 수 있습니다 (에이전트 또는 '대행사'에서 POST를 사용할 수 있음).
복잡한 예 :
집을 사다 :
당신은 당신의 신용도 (경찰 기록을 제공하는 것과 같이)를 증명하고, 재정적 세부 사항을 보장해야하며, 변호사와 자금을 저장하는 신뢰할 수있는 제 3자를 사용하여 실제 집을 사야하고, 집이 당신의 소유이고 구매 기록을 세금 기록 등에 추가하십시오 (예를 들어, 일부 단계가 잘못되었거나 기타 일 수 있음).
이 단계는 완료하는 데 며칠이 걸릴 수 있으며 일부는 병렬로 수행 될 수 있습니다.
이렇게하려면 에이전트에게 다음과 같은 작업 구매 집을 제공하십시오.
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
끝난. 대행사는이 작업의 상태를보고 추적하는 데 사용할 수있는 참조를 반송하며 나머지는 대행사의 에이전트가 자동으로 수행합니다.
예를 들어 버그 추적기를 생각해보십시오. 기본적으로 버그를보고하고 버그 ID를 사용하여 진행 상황을 확인할 수 있습니다. 서비스를 사용하여이 자원의 변경 사항을 청취 할 수도 있습니다. 미션 완료