2015-08-14 90 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这可能是您要查找的内容。

尽管我喜欢静态字符串,所以您并不总是必须向团队中的未来开发人员展示如何在客户端需要更新时使用这些库。