我正在编写一个 REST API 并遇到以下问题:
使用资源 /messages/,我的 MessageController 中有以下方法:
[HttpGet]
// retrieves all messages for a user
public HttpResponseMessage GetMessages(Guid RecordId) {}
[HttpGet]
// retrieves only a single messages, specified by guid
public HttpResponseMessage GetMessage(Guid RecordId) {}
在我的 WebApiConfig.cs 中,我有以下路由:
config.Routes.MapHttpRoute(
name: "MessageRouting",
routeTemplate: "messages/{RecordId}/",
defaults: new { controller = "Message", RecordId= RouteParameter.Optional }
);
当然,这会失败,因为路由不知道要调用哪个方法。这里的问题是,为了保持 RESTful,我想避免使用额外的查询参数,例如
GET /messages/?userid=1
我是否应该从 AccessToken 中提取 userId 并按如下方式调用 GetMessages?
GET /messages
AccessToken=foo
我也会在使用 [HttpPost] 和 [HttpPut] 时遇到同样的问题 - 我总是有一个集合或一个我想使用的项目,所以对于每个 Http 方法,我至少有 2 个方法可以调用.
我没有将 GetMessages() 方法移动到 UserController 的选项,因为在那里我会遇到同样的问题 - 似乎使用 Web Api,控制器只能将每个 HTTP 方法定义一次,这使得处理集合与单个项目非常困难。
我在保留 RESTful 和让 URL唯一标识资源之间有点纠结,但似乎 .NET 在这里没有给我选择,因为我无法在路由中指定 HTTP 方法。或者我可以吗?