2016-09-12 12 views
1

내 API에서 HATEOAS을 구현하는 방법에 대해 머리를 쓰려고합니다. 나는 현재 상황에서 적절한 행동 만 클라이언트에게 제공하는 개념 중 하나를 좋아한다. 그러나 나는이 아이디어를 올바르게 구현하는지 잘 모르겠습니다. HATEOAS 및 링크/동작

이의 내가 변경할 수있는 상태로 자원 유형 위해 있다고 가정 해 봅시다, 그것은 다양한 상태를 가질 수있다 ( 감소, 처리, 받아, 성공, 만료). 다음 json 객체를 생성해야합니까?

{ 
    ... 
    "links": { 
     "accept": "http://example.com/order/1/accept", 
     "decline": "http://example.com/order/1/decline" 
    } 
} 

여기에 불필요한 작업이 있습니까? 위의 내용이 맞다면 패치 나 GET으로 상태를 변경해야합니까? 그리고 만약 그것이 패치라면, 어떻게 하이퍼 미디어의 목적을 물리 칠 수 있을까요?

편집 :이의 내가 그것을 다른 상태를 (처리, 승인, 거부, 성공 만료 수, 변경할 수있는 상태로 자원 유형의 순서가 있다고 가정 해 봅시다 주문 ID

답변

4

을 추가 잊으).

경고 : 도메인이 문서 관리 일 경우가 아니라면 자원을 도메인 개념과 일치 시키려면 혼란에 빠질 수 있습니다. 짐 웨버 warned about this years ago; 대부분의 경우, 자원은 통합 도메인의 일부입니다. 도메인 모델과 상호 작용하는 데 사용되는 작은 디지털 조각입니다.

{ 
    ... 
    "links": { 
     "accept": "http://example.com/order/accept", 
     "decline": "http://example.com/order/decline" 
    } 
} 

기본 아이디어는 괜찮습니다. 클라이언트가 수락 프로토콜을 호출하려면 사용하려는 링크를 알고 있어야합니다. 마찬가지로 거절 프로토콜. 다른 것은 클라이언트가 링크를 사용할 수 없기 때문에 시도해서는 안된다는 것을 알고 있습니다. 예를 들어 클라이언트의 목표가 주문을 만료하는 것이었다면 그것이 막 다른 방향으로 진행되었다는 것을 알 수 있습니다.

URI의 철자는 약간 이상합니다. 클라이언트는 철자를 신경 쓸 필요는 없지만 요청은 무국적이어야합니다. 주문이 유형의 자원 인 인 경우 수락/거부 할 주문을 어떻게 전달하고 있습니까?

위의 내용이 맞으면 상태가 패치 또는 GET으로 변경되어야합니까?

도 아니다.

는 자원이 GET 지원 광고 중개 구성 요소가 추측 링크, 클라이언트 시간을 절약 할 수있는 결과를 미리로드를 따라 할 수 있다는 것을 의미 작업이 안전을 것을 주장이 때문에이 잘못 GET. 아니 당신이 클라이언트이 문제가

PATCH에 의해 결정를 전달하는 메시지를 이해하는 경우 일을 할 것. 첫째, 문서 조작을 위해 설계되었습니다. 응용 프로그램이 문서 데이터베이스 인 경우 패치는 하나 또는 여러 개의 범위 변경을 수행하는 데 환상적입니다.그러나 비즈니스 모델의 프록시 표현을 다루는 것은 그리 좋지 않습니다. 클라이언트가 의도를 서버에 전달하는 대신 클라이언트는 의도에 대한 표현에 대한 부작용을 전달한 다음 서버가 부작용으로부터 의도를 추론하려고 시도합니다.

하지만 그럴 가능성이 있습니다. 결국, 지원하는 미디어 유형을 선택할 수 있으며 잠재적으로 고객의 의도를 표현할 수있는 유형으로 제한 될 수 있습니다.

두 번째 문제는 패치가 멱등수가 아니라는 것입니다. 그것은 POST와 같은 실패 모드를 가지고 있습니다. 요청이 서버에 의해 확인되지 않으면 클라이언트는 요청을 다시 시도하는 것이 안전한지 쉽게 판단 할 수 없습니다.

직선 앞으로 접근 방식은 사람의받은 편지함 54321가 승인해야

주문에 손으로 쓴 메모를 성공시키는 등 유사 편집을 생각하는 것입니다. 제발 끝내주세요. 서명 된 클라이언트.

즉, 주문 자원을 직접 조작하려고하는 것이 아니라받은 편지함에 주문을 조작하는 부작용이있는 메모를 전달하는 것입니다. 클라이언트는 원하는 변경 내용을 설명하고 서버는 변경 작업을 수행합니다 (서버가 자치권을 갖도록 허용하는 경우).

이 방법의 경우 PUT (멱등수) 또는 POST (적합하지 않음)가 적합합니다. 사실상,받은 편지함 컬렉션에 새 메시지를 추가하고 해당 관용구를 사용하여 적합한 방법을 선택할 수 있습니다.

만약 그것이 패치 였다면, 어떻게 하이퍼 미디어의 목적을 저지르는 것을 알 수 있습니까?

클라이언트는 "링크"속성에서 링크를 찾는 방법을 어떻게 알 수 있습니까?

브라우저가 HTML 문서의 링크를 어떻게 처리해야하는지 어떻게 알 수 있습니까?

REST 응답은 다음과 같습니다. 미디어 유형 자체를 설계하는 데 많은 노력을 기울 였기 때문입니다. 웹의 경우, text/html 미디어 유형을 설계하는 데 많은 시간과 노력이 필요했기 때문에 html로 염두에두고 설계된 클라이언트는 해당 이해를 공유하는 서버에서 생성 된 표현을 소비 할 수 있습니다. 클라이언트와 서버는 서로 분리되어 있지만 공통 접지를 공유합니다.

HTML의 경우 대부분 미디어 유형은 링크와 관련된 HTTP 메소드를 정의합니다 (예외는 양식이므로 제한된 세트의 메소드를 표현할 수 있습니다). 거인의 어깨에 서십시오.

+0

귀하의 철저한 답변에 감사드립니다 (귀하가 옳은 리소스 ID를 추가하는 것을 잊어 버렸습니다). 위의 내용을 읽으면서 PATCH를 선택하십시오. 패치의 json 페이로드는 무엇입니까? 다음과 같이합니다. PATCH : http://example.com/order/1/accept {status : "accept"}? – adnan

+0

아니요, 새로운 리소스를 가져올 것입니다. PATCH를해야한다면, PATCH media type을 선택해야합니다. 아마도 : https://tools.ietf.org/html/rfc6902 – VoiceOfUnreason

+0

오, 오, 오, 미안하다. 그래서 PUT : 페이로드 {status : "accept"}가있는 example.com/order/1/accept. 아니면 다른 페이로드를 추천 하시겠습니까? – adnan