2012-09-05 23 views
19

Jestem ciekaw, jak inni poradzili sobie z kwestią generowania linków hipermedialnych dla swoich internetowych API? W szczególności używam ASP.NET Web API i jestem rozdarty pomiędzy operacjami zwracającymi typy związane z hipermediami lub zwracaniem samego zasobu i posiadaniem hipermedialnych rzeczy później w trakcie realizacji. Oznacza to, że ludzie mają tendencję do robienia rzeczy, takich jak:Generowanie linków hipermediów w interfejsie API WWW

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

lub coś bardziej jak

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

A potem dodawać linki hipermedialne wewnątrz HttpOperationHandler lub niestandardowego formater czy coś?

Jeśli podejście jest bardziej podobne do # 2, skąd wiadomo, jakie linki generować? Czy masz jakiś standardowy zestaw linków generowanych dla wszystkich obiektów zamówienia? Atrybuty dekorujące różne operacje w OrdersController?

+0

Dodatek: Czytałem o poście Glenna Blocka o hipermedii w Web API (http://codebetter.com/glennblock/2012/01/08/hypermedia-and-web-api-design-brain-dump-and -samples /) i chociaż wydaje się, że faworyzuje generowanie linków w działaniu (podobnie jak w przykładzie 1 powyżej), czuję, że droga "middleware", o której wspomina pod koniec, wydaje się bardziej naturalna. – Jordan0Day

+1

Spójrz na prezentację od ammy na teched newzealand http://channel9.msdn.com/Events/TechEd/NewZealand/2013/DEV305 jej rozwiązanie jest obiecujące dla hipermedii z api web również wyglądają tutaj kod przykładowy github – Gomes

Odpowiedz

24

Preferuję opcję drugą (dodając linki hipermedialne później w przygotowaniu) i blogged about doing this yesterday.

Rozwiązaniem było "wzbogacenie" moich zasobów hiperłączami, zanim zostaną one zwrócone do klienta za pomocą procedury obsługi wiadomości.

+0

To jest naprawdę fajne, dzięki za udostępnienie. Użyliśmy metod rozszerzenia i było to więcej kodu cookie cutter, który stanowił 1 linię kodu w metodzie akcji. Podoba mi się, że masz zwracany zasób i możesz dodać lub nie dodawać hipermedii na podstawie kontekstu. – suing

9

Można użyć Hyprlinkr od github

Mam zamiar używać go w moim kolejnym projekcie, gdyż seens być miły i łatwo to zrobić i można go pobrać za pośrednictwem pakietu Nuget.

+3

Więc Hyprlinkr jest dobre rozwiązanie do generowania linków - gdy wiesz, jakie linki chcesz wygenerować. Moje pytanie dotyczyło raczej "skąd mam wiedzieć, które linki muszę generować", a nie "jak je wygenerować?" Tak czy inaczej, Hyperlinkr pomaga rozwiązać problem, gdy dojdziesz do części "jak". – Jordan0Day

2

Odpowiadając na to pytanie, to pouczające patrzeć w kierunku podejścia ASP.NET MVC do obsługi tego, ponieważ ASP.NET MVC może być postrzegane jako text/html ograniczonej wersji Web API (instrukcja treści negocjacji pomimo), a także dlatego, że w oczywisty sposób znacząco wpłynął na projektowanie Web API.

Zasadniczo możemy użyć niestandardowych formaterów do zmiany reprezentacji na podstawie trasy lub atrybutu działania. Informuje o tym sposób, w jaki ASP.NET MVC oddziela widoki od modeli. W projekcie ASP.NET MVC jeden model może być renderowany za pomocą różnych szablonów widoku. Każdy z tych szablonów widoku zasadniczo "twardo-kody" przejściowe linki (kotwica, forma i elementy łącza) do tej konkretnej reprezentacji modelu. Wybór szablonu widoku jest sterowany głównie konwencją (kontrolerem i nazwą akcji), ale może być również zakodowany w akcji.

Mechanizm wyświetlania i wizualizacja w ASP.NET MVC można uznać za niestandardowy program formatujący Web API. Może to zostać uogólnione w taki sposób, że dla każdego obsługiwanego typu nośnika formater niestandardowy wykorzystuje szczegóły trasy - i opcjonalnie atrybut zastosowany do wywoływanej metody działania - w celu zdefiniowania stanu zasobu. (Zgodnie z tą konwencją, przy wybieraniu nazw działań, które odzwierciedlają stan zasobu, jest korzyść.) Po tym, gdy formater rozpozna stan zasobu, może przekazać kod specyficzny dla stanu. W tym kodzie znajduje się określenie linków specyficznych dla danego stanu.

Ten specyficzny dla stanu kod formatowania może również przekazywać inne podformatki, podobnie jak w widokach Razor, które wspierają składanie widoków częściowych.

1

Dodałem moje rozwiązanie here

Wykorzystuje klasy i atrybuty właściwość w połączeniu z metodą wydłużania ApiController do wypełnienia obiektu ResourceLink w swojej jednostce. Może również wypełniać łącza dla dowolnych właściwości kolekcji. To nie jest gotowy artykuł, ale jest dość intuicyjny i będzie dobrym początkiem.

Powiązane problemy