2012-09-05 6 views
19

다른 사람들이 웹 API 용 하이퍼 미디어 링크 생성 문제를 어떻게 처리했는지 궁금합니다. 특히 ASP.NET 웹 API를 사용하고 있으며 작업이 하이퍼 미디어 관련 형식을 반환하거나 리소스 자체를 반환하는 것과 하이퍼 미디어가 나중에 파이프 라인에서 발생하는 것 사이에서 찢겨납니다.웹 API에서 하이퍼 미디어 링크 생성

public Resource<Order> GetOrder(int id) { 
    return new Resource<Order>() { 
     Content = new Order(), 
     Links = new LinkCollection<Order>() { new AddOrderLink(), new UpdateOrderLink()} 
    } 

이상의

public Order GetOrder(int id) { return new Order(); } 

같은 그리고 다음 HttpOperationHandler 또는 사용자 정의 포맷터 또는 뭔가 내부에 하이퍼 링크를 추가 :입니다 , 사람들은 같은 일을하는 경향이 있습니까?

접근 방식이 # 2와 비슷하면 어떤 링크를 생성해야하는지 어떻게 알 수 있습니까? 모든 Order 객체에 대해 생성되는 몇 가지 표준 링크 집합 만 있으면됩니까? OrdersController에서 다양한 작업을 꾸미는 속성은 무엇입니까?

+0

부록 : 웹 API (http://codebetter.com/glennblock/2012/01/08/hypermedia-and-web-api-design-brain-dump-and)에서 하이퍼 미디어에 대한 Glenn Block의 게시물을 읽었습니다. -samples /) 그리고 그가 링크를 생성하는 것을 선호하는 것처럼 보이는 동안 (위의 예제 1과 유사), 나는 결국 그가 말한 "미들웨어"경로가 더 자연 스럽다고 느낀다. – Jordan0Day

+1

teched newzealand에서 ammy에서 프리젠 테이션을보세요. http://channel9.msdn.com/Events/TechEd/NewZealand/2013/DEV305 그녀의 솔루션은 웹 API를 사용하여 하이퍼 미디어에 유망합니다. 여기 github 샘플 코드 – Gomes

답변

24

두 번째 옵션 (파이프 라인에서 나중에 하이퍼 미디어 링크 추가)과 blogged about doing this yesterday을 선호합니다.

해결 방법은 메시지 처리기를 사용하여 클라이언트에 반환되기 전에 내 리소스를 하이퍼 미디어 링크로 "풍부하게 만드는"것이 었습니다.

+0

정말 멋집니다. 공유해 주셔서 감사합니다. 우리는 확장 메서드를 사용했으며, 액션 메서드에서 코드 줄을 차지하는 쿠키 커터 코드가 더 많았습니다. 리소스가 반환되고 컨텍스트를 기반으로 하이퍼 미디어를 추가하거나 추가하지 않을 수 있습니다. – suing

9

당신은 내가 좋은 그것을 쉽게 할 수 seens 나의 다음 프로젝트에서 사용할 계획입니다 github

에서 Hyprlinkr를 사용할 수 있으며 nuget 패키지를 통해 얻을 수 있습니다.

+3

을 참조하십시오. Hyprlinkr는 실제로 링크를 생성하기위한 좋은 솔루션 - 생성하려는 링크를 알고있을 때. 내 질문은 "어떻게 생성해야합니까?"보다는 "생성해야하는 링크를 어떻게 알 수 있습니까?" 어떤 방법 으로든 Hyperlinkr는 "방법"부분에 도달하면 문제를 해결하는 데 도움을줍니다. – Jordan0Day

2

ASP.NET MVC 은 웹 API의 text/html-constrained 버전으로 볼 수 있기 때문에이 문제를 해결하기 위해 ASP.NET MVC 접근 방식을 살펴 보는 것이 좋습니다. (수동 콘텐츠 협상에도 불구하고), 분명히 웹 API의 디자인에 많은 영향을 주었기 때문이다.

기본적으로 라우트 또는 작업 속성을 기반으로 표현을 변경하기 위해 사용자 지정 포맷터를 사용할 수 있습니다. 이것은 ASP.NET MVC가 뷰를 모델과 분리하는 방식으로 알려줍니다. ASP.NET MVC 프로젝트에서 단일 모델을 다양한 뷰 템플릿으로 렌더링 할 수 있습니다. 이러한 뷰 템플릿은 기본적으로 전환 링크 (앵커, 양식 및 링크 요소)를 해당 모델의 특정 표현에 "하드 코드"합니다. 뷰 템플릿의 선택은 규칙 (컨트롤러 및 액션 이름)에 의해 주로 주도되지만 액션에서 하드 코딩 될 수도 있습니다.

ASP.NET MVC의보기 엔진 및보기 찾기 규칙은 사용자 지정 웹 API 포맷터로 간주 될 수 있습니다. 이것은 지원되는 각 미디어 유형에 대해 커스텀 포매터가 라우트 상세 정보 (그리고 선택적으로 호출 된 액션 메소드에 적용된 속성)를 사용하여 리소스 상태를 정의하도록 일반화 될 수 있습니다. 이 컨벤션에서는 리소스 상태를 반영하는 액션 이름을 선택하는 것이 좋습니다. 포맷터가 리소스 상태를 알게되면 상태 별 서식 지정 코드에 위임 할 수 있습니다. 이 코드에서는 국가 별 링크가 정의됩니다.

이 상태 별 형식 지정 코드는 면도기 뷰가 부분 뷰의 구성을 지원하는 것과 거의 같은 방식으로 다른 하위 형식을 위임 할 수 있습니다.

1

나는 내 솔루션 here

그것은 클래스를 사용하여 속성이 당신의 엔티티에 ResourceLink 객체를 채울 수있는 ApiController 확장 방법과 함께 속성을 추가했습니다. 또한 모든 콜렉션 특성에 대한 링크를 채울 수 있습니다. 완성 된 기사는 아니지만 매우 직관적이며 좋은 출발을 할 것입니다.