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

时间:2015-05-25 10:06:10

标签: c# asp.net-web-api asp.net-web-api2

我想创建一个REStful Web服务。

此服务返回某个

的“会议”

一天一周几个月

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

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

有3个Get方法我只能通过http-method类型'GET'来访问API了:

// GET: api/meetings/date

因为会有多个GET ......

我可以合并ByWeek和ByMonth方法并改为:

GetMeetings(startDate,endDate);

你如何使这项服务RESTful?

4 个答案:

答案 0 :(得分:2)

我不会在方法名称方面考虑它 - 我会从开头的URL开始考虑它:

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

将其视为会议集合,查询参数只是 - 查询参数。我希望在网址中meetings元素之后的任何值都是会议ID - 例如,您的GetMeetings方法可能会返回ID为foobar的会议,然后我会期望能够稍后用

获取
/api/meetings/foobar

这表明我根本不应将date作为网址路径的一部分。

在实现方面,我对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。)

答案 1 :(得分:1)

  

Web API 2支持一种新类型的路由,称为属性路由。

这是您需要使用属性路由的方案。

例如:

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

基于约定的路由的一个优点是模板   在一个地方定义,并应用路由规则   贯穿所有控制器。不幸的是,基于会议   路由使得很难支持常见的某些URI模式   在RESTful API中。

在这里阅读更多内容:

来自之前的好答案(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?可以为您提供更多知识,因为它已得到很好的回答。

编辑:

  

我可以合并ByWeek和ByMonth方法并改为:

     

GetMeetings(startDate,endDate);

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

答案 2 :(得分:0)

查看Web API路由 - 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

答案 3 :(得分:0)

要创建包含多个WebApi请求的Controller GET,您需要按以下方式指定路线:

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

这可以解决您的问题。

相关问题