2015-08-14 88 views
1

網頁API路線終點所以,我有兩個獨立的項目(一個網頁API 2,一個MVC)這樣的圖:enter image description here強類型MVC中

的MVC具有控制器和一個服務層。 MVC應用程序調用web api控制器的服務。例如:

await _service.GetGiftCards("/api/GiftCards/ViewAllByUser", email); 

的網絡API控制器的路由是定義像這樣:

[RoutePrefix("api/giftcards")] 
[Route("ViewAllByUser")] 
    public async Task<List<GiftCard>> GetGiftCardsForUser(string email){} 

所以定義在MVC應用程序中的端點的路線,我只是通過像「字符串/ API/FIELDS禮品卡/ ViewAllByUser「上面。

我的問題是,是否有更好的方式來排序的「強類型」被定義,所以我可以做這樣的事情?:

await _service.GetGiftCards(GiftCardController.ViewAllByUser, email); 

我想在最低的網絡API路線的終點我總是可以只存儲端點字符串像這樣一個靜態類,所以他們至少可以在一個地方進行更新:

public static class ApiEndpoints(){ 
    public string GetAllGiftCards = "api/GiftCards/ViewAllByUser"; 
} 

但我希望知道是否有更好的方法或其他建議。謝謝!

+1

是否有理由明確指定路線而不是依賴約定? – timothyclifford

+0

Web API控制器將用於幾個外部應用程序(Web,移動等),並將封裝數據訪問和業務邏輯,因此我將它們命名爲更像描述性方法名稱,但我可以看到依賴約定的用法在大多數情況下相反。但是不管我的路由名是什麼,我仍然希望能夠強烈引用它來使用它。 – reverence12389

+0

如果你想要一個統一資源定位符的強類型表示,那麼[有一種類型](https://msdn.microsoft.com/en-us/library/system.uri(v = vs.110) )的.aspx)。也許爲這些傢伙保留一個行動圖?儘管如此,你最終會在某些時候將它們構建成字符串,因爲這就是網址。 –

回答

3

API路由不應指定操作。您希望您的路線成爲一條記錄或一組記錄的邏輯路徑。例如,在你的情況下,路線應該看起來像這樣:

GET 
api/giftcards/{userID:int:min(1)} 

你希望能夠基本上走上網址,並得到你所期望的。在示例路線的情況下,您將獲得基於用戶ID的禮品卡。如果您要脫掉用戶標識頁面,只需調用api/giftcards,您就可以獲得所有用戶的所有禮品卡。我在這裏使用了一個ID,但您也可以使用電子郵件。

+1

感謝您的建議。我會將其作爲一個更好的命名標準考慮在內,因爲這是一個好主意。但是,這仍然不能解決我如何在我的MVC項目中「強烈」引用該路由的問題,所以我不必手動將url作爲字符串傳遞。有關於此的任何想法? – reverence12389

+1

看起來你已經有了這樣做的最好方法。在嵌套類中使用常量路徑。所以基本上你有一個AppConstants類,裏面有一個靜態類APIRoutes,然後靜態常量字符串與你的API路徑。然後打電話給你,你會像使用你的問題一樣使用它:(AppConstants.APIRoutes.Giftcards,email) –

0

普萊斯嘗試用 'ActionName' 屬性的動作是這樣的:

[ActionName("SelectAll")] 
     public IEnumerable<Customer> Get() 
     { 
     ... 
     } 

調用這個動作的名稱,如:

$("#getdata").click(function() { 
    var options = {}; 
    options.url = "/api/customer/SelectAll"; 
    options.type = "GET"; 
    ... 
    ... 
    $.ajax(options); 
}); 

一張字條: '的GetData' 是控制的id,這將click事件會從api發起並調用'api method'和getdata

0

Here's a library這可能是您要查找的內容。

儘管我喜歡靜態字符串,所以您並不總是必須向團隊中的未來開發人員展示如何在客戶端需要更新時使用這些庫。