【问题标题】:Supporting GET *and* POST in WebApi在 WebApi 中支持 GET *和* POST
【发布时间】:2013-08-05 17:15:22
【问题描述】:

让我们有一个测试模型。

public class TestRequestModel
{
    public string Text { get; set; }
    public int Number { get; set; }
}

我希望此服务能够接受以下请求:

  • GET /test?Number=1234&Text=MyText
  • POST /test 带有标题:Content-Type:application/x-www-form-urlencoded 和正文:Number=1234&Text=MyText
  • POST /test 带有标题:Content-Type: application/json 和正文:{"Text":"Provided!","Number":9876}

路由配置如下:

_config.Routes.MapHttpRoute(
   "DefaultPost", "/{controller}/{action}",
   new { action = "Post" }, 
   new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });

_config.Routes.MapHttpRoute(
   "The rest", "/{controller}/{action}",
   defaults: new { action = "Get" });

我的控制器如下所示:

public class TestController : ApiController
{
    [HttpGet]
    public TestResponseModel Get([FromUri] TestRequestModel model)
    {
       return Do(model);
    }

    [HttpPost]
    public TestResponseModel Post([FromBody] TestRequestModel model)
    {
       return Do(model);
    }
    (...)

这似乎是可接受的样板代码数量,但如果可能的话,我仍然想避免它。

拥有额外的路线也不理想。我害怕 MVC/WebAPi 路由,我相信它们是邪恶的。

有没有办法避免使用两种方法和/或 DefaultPost 路由?

【问题讨论】:

  • 我认为您添加了太多代码,请查看生成的默认项目。你不需要你的属性或特殊路线来做你正在做的事情。此外,不同的动词表示不同的内涵,GET 用于访问数据,POST 用于创建新数据。

标签: c# asp.net-web-api


【解决方案1】:

您所要求的不是 ASP.NET Web API 的典型要求。在 ASP.NET MVC 中,通常使用相同的操作方法来处理初始 GET 和后续回发 (POST)。 ASP.NET Web API 用于构建 HTTP 服务,GET 用于检索资源而不更改系统中的任何内容,而 POST 用于创建新资源,正如 Matthew 所指出的那样。

无论如何,在 Web API 中使用一种操作方法来实现这一点并非不可能。但是您希望相同的操作方法不仅可以处理 GET 和 POST,还可以进行模型绑定和格式化程序绑定。模型绑定(类似于 MVC)将请求 URI、查询字符串等绑定到参数,而格式化程序绑定(Web API 独有)将正文内容绑定到参数。默认情况下,简单类型从 URI 绑定,查询字符串从正文绑定。因此,如果您有一个带有 string text, int number, TestRequestModel model 参数的操作方法,您可以从 URI 或正文绑定 Web API,在这种情况下,您需要检查哪些内容不为空并使用它。但是,不幸的是,这样的解决方案看起来更像是一个 hack。或者,如果您希望从 URI/查询字符串和正文中填充相同的复杂类型,则需要编写自己的参数绑定器来检查请求部分并相应地填充参数。

另外,您不需要有两个路由映射。像这样的默认设置就可以了。

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2023-02-05
    相关资源
    最近更新 更多