2012-09-05 62 views
19

我很想知道其他人如何處理爲其Web API生成超媒體鏈接的問題?具體來說,我使用的是ASP.NET Web API,並且在操作返回與超媒體相關的類型,或者返回資源本身,以及在管道中稍後發生超媒體事件之間存在分歧。 也就是說,做的人往往會做這樣的事情:在Web 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

附錄:我已經閱讀了Glenn Block關於Web API中超媒體的文章(http://codebetter.com/glennblock/2012/01/08/hypermedia-and-web-api-design-brain-dump-and雖然他似乎贊成生成操作鏈接(類似於上面的示例1),但我覺得他提到的「中間件」路線感覺更加自然。 – Jordan0Day

+1

看看來自ammy的介紹teched newzealand http://channel9.msdn.com/Events/TechEd/NewZealand/2013/DEV305她的解決方案是有希望的超媒體與網頁api也看看這裏github示例代碼 – Gomes

回答

24

我更喜歡選項二(稍後在管道中添加超媒體鏈接)和blogged about doing this yesterday

解決方案是用超媒體鏈接「豐富」我的資源,然後再使用消息處理程序將它們返回給客戶端。

+0

這真的很酷,感謝分享。我們使用擴展方法,它更多的是在操作方法中佔據1行代碼的cookie切割器代碼。我喜歡你有資源被返回,並且可以根據上下文添加或不添加超媒體。 – suing

9

您可以從github

使用Hyprlinkr我打算,因爲它作用似乎是好的和容易做它用它在我的下一個項目,你可以通過NuGet包得到它。

+3

所以Hyprlinkr是一個實際生成鏈接的好解決方案 - 當你知道你想要生成的鏈接時。我的問題更多地圍繞「我怎麼知道我需要生成哪些鏈接」,而不是「我應該如何生成它們?」不管怎樣,一旦你瞭解了「how」部分,Hyperlinkr確實有助於解決問題。 – Jordan0Day

2

在回答這個問題時,看看ASP.NET MVC方法來處理這個問題是有益的,因爲ASP.NET MVC 可能會將視爲Web API的文本/ HTML約束版本(儘管有手動內容協商),因爲它顯然嚴重影響了Web API的設計。

基本上,我們可以使用自定義格式化程序來根據路由或操作屬性改變表示。這是通過ASP.NET MVC從模型中分離視圖的方式得到的。在ASP.NET MVC項目中,可以通過各種視圖模板呈現單個模型。這些視圖模板中的每一個都基本上將過渡鏈接(錨點,表單和鏈接元素)「硬編碼」爲該模型的特定表示。視圖模板的選擇主要由約定(控制器和動作名稱)驅動,但也可以在動作中進行硬編碼。

ASP.NET MVC中的視圖引擎和視圖查找約定可以被認爲是一個自定義的Web API格式器。這可以通用化,以便對於每種支持的媒體類型,自定義格式化程序使用路由詳細信息 - 以及可選的應用於被調用的操作方法的屬性 - 來定義資源狀態。 (在這個約定下,選擇反映資源狀態的動作名稱是有好處的。)一旦格式化程序知道資源的狀態,它就可以委託給特定於狀態的格式代碼。在此代碼中,將定義特定於狀態的鏈接。

此狀態特定的格式代碼也可以委託給其他子格式,與Razor視圖支持部分視圖的組合相同。

1

我已經添加了我的解決方案here

它使用類和屬性結合的ApiController擴展方法在實體來填充ResourceLink對象屬性。它也可以填充任何收藏屬性的鏈接。這不是完成的文章,但它非常直觀,並且會有一個良好的開端。