.NET Web Api - 几种GET和POST方法

时间:2012-09-10 10:39:44

标签: .net rest asp.net-web-api

我正在编写REST API并遇到以下问题:

使用resource / 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方法路由。或者我可以吗?

1 个答案:

答案 0 :(得分:3)

找到解决方案 - 在WebApiConfig.cs中,您可以为路径指定“name”属性。此属性可用于注释方法,例如:

public class MessageController() {

    [ActionName("MultipleMessages")]
    [HttpGet]
    public HttpResponseMessage GetMessages(Guid UserId) {}

    [ActionName("SingleMessage")]
    [HttpGet]
    public HttpResponseMessage GetMessage(Guid MessageId) {}

}

这样,您可以在同一个控制器中使用多个GET或POST方法。调用这些方法的路径如下所示:

// multiple messages, will call MessageController.GetMessages()
config.Routes.MapHttpRoute(
    name: "MultipleMessages",
    routeTemplate: "users/{UserId}/messages",
    defaults: new { controller = "Message", UserId = RouteParameter.Optional }
);

// single messages, will call MessageController.GetMessage()
config.Routes.MapHttpRoute(
    name: "SingleMessage",
    routeTemplate: "messages/{MessageId}/",
    defaults: new { controller = "Message", MessageId = RouteParameter.Optional }
);