使用 3 个类似的 Get 方法创建 RESTful 服务

Create a RESTful service with 3 similar Get methods

我想创建一个 REStful 网络服务。

此服务returns"Meetings"某

.

我将创建 3 个 Get 方法,这些方法采用 API 用户确定的日期值。

GetMeetingsByDay(currentDate)
GetMeetingsByWeek(startDate,endDate)
GetMeetingsByMonth(startDate,endDate)

有 3 个 Get 方法,我无法再通过 http 方法类型 'GET' 访问 API,例如:

// GET: api/meetings/date

因为会有多个GET...

我可以合并 ByWeek 和 ByMonth 方法,改为这样做:

GetMeetings(startDate,endDate);

你会如何提供这项服务RESTful?

我不会从方法名称的角度来考虑它 - 我会从 URL 开始的方式来考虑它:

/api/meetings?date=...
/api/meetings?startDate=...&endDate=...

将其视为 collection 会议,查询参数就是 - query 参数。我希望 URL 中 meetings 元素之后的任何值都是会议 ID - 例如,您的 GetMeetings 方法可能 return 会议 ID 为 foobar 然后我希望稍后可以使用

获取它
/api/meetings/foobar

我认为你根本不应该将 date 作为 URL 路径的一部分。

在实现方面,我对 WebAPI 路由的了解不够,不知道您是否可以使用以下两种方法实现它:

[HttpGet]
[Route("api/meetings")]
public ... GetMeetings([FromUri] DateTime startDate, [FromUri] DateTime endDate)

[HttpGet]
[Route("api/meetings")]
public ... GetMeetings([FromUri] DateTime date)

...或者您是否需要带有可选参数的单个方法:

[HttpGet]
[Route("api/meetings")]
public ... GetMeetings(
    [FromUri] DateTime? date = null,
    [FromUri] DateTime? startDate = null,
    [FromUri] DateTime? endDate = null)

在后一种情况下,您需要验证提供的参数集是否有效。

(如评论中所述,您可能根本不需要此处的 Route。)

看WebAPI路由-http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

否则,您可以只使用查询字符串 - 例如 api/meetings/date?currentDate=x&startDate=x&endDate=x

Web API 2 supports a new type of routing, called attribute routing.

这是需要使用属性路由的场景。

例如:

 [Route("customers/{customerId}/orders")]
 public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

One advantage of convention-based routing is that templates are defined in a single place, and the routing rules are applied consistently across all controllers. Unfortunately, convention-based routing makes it hard to support certain URI patterns that are common in RESTful APIs.

在此处阅读更多内容:

来自之前的好回答(source):

如果您有多个 Get 操作具有相同类型的单个原始参数,ASP.NET Web API 将查看参数的名称以解决哪个重载调用操作。

例如,如果您有两个操作:

GetProductByName(string name) 
GetProductByCategory(string category) 

您的 http 客户端可以调用为:

api/products?name=hammer 
api/products?category=toys

路由引擎将调用正确的操作。

SO 问题 How does ASP.NET Web.api handle two methods with names starting with GET? 可以为您提供更多知识,因为它已得到很好的回答。

编辑:

I could merge the ByWeek and ByMonth methods and do this instead:

GetMeetings(startDate,endDate);

如果您没有进入 GetMeetingsbyWeekGetMeetingsbyMonth 的任何特定逻辑,我肯定会鼓励您这样做,就像它只是在指定日期范围内从数据库中获取列表一样。

创建一个WebApi Controller 有多个GET 请求,你需要指定路由如下:

routeTemplate:api/{Controller}/{action}/{param}

这应该可以解决您的问题。