使用 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);
如果您没有进入 GetMeetingsbyWeek
和 GetMeetingsbyMonth
的任何特定逻辑,我肯定会鼓励您这样做,就像它只是在指定日期范围内从数据库中获取列表一样。
创建一个WebApi
Controller
有多个GET
请求,你需要指定路由如下:
routeTemplate:api/{Controller}/{action}/{param}
这应该可以解决您的问题。
我想创建一个 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);
如果您没有进入 GetMeetingsbyWeek
和 GetMeetingsbyMonth
的任何特定逻辑,我肯定会鼓励您这样做,就像它只是在指定日期范围内从数据库中获取列表一样。
创建一个WebApi
Controller
有多个GET
请求,你需要指定路由如下:
routeTemplate:api/{Controller}/{action}/{param}
这应该可以解决您的问题。