我想创建一个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?
答案 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);
如果你没有任何特定的逻辑进入GetMeetingsbyWeek
和GetMeetingsbyMonth
,我肯定会鼓励这样做,就像它只是在指定的日期范围内从数据库中提取一个列表一样。
答案 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}
这可以解决您的问题。