【问题标题】:.NET Web Api - several GET and POST methods.NET Web Api - 几种 GET 和 POST 方法
【发布时间】:2014-09-19 23:34:10
【问题描述】:

我正在编写一个 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 方法路由。或者我可以吗?

【问题讨论】:

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


    【解决方案1】:

    找到解决方案 - 在 WebApiConfig.cs 中,您可以为路由指定“名称”属性。该属性可用于对方法进行注解,如:

    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 }
    );
    

    【讨论】:

    • 太棒了。我假设 [ActionName] 只对应于默认参数上的“动作”属性。这是一种享受。
    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2011-10-30
    • 2023-03-10
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多