【问题标题】:ASP.NET Web Api duplicate verbsASP.NET Web Api 重复动词
【发布时间】:2015-11-21 00:57:26
【问题描述】:

我创建了一个名为 Filter 的 Web api (REST),它有多个 get 方法,例如

获取公司 获取客户 获取订单

这是正确的做法还是我应该为不同的实体使用不同的 web api?我是否应该在同一个 WEB API 中重复相同的 http 动词 (GET)。

其他动词(POST 或 PUT)呢?

在另一种服务中,我们有一种情况是我们想要更新特定字段,另一种情况是我们可以更新记录中除该特定字段之外的任何内容。两种情况都应该使用一种方法(POST 或 PUT)还是我可以有两种单独的方法?

我从 angularjs $http 服务调用这些方法。

【问题讨论】:

  • 你没有CompanyController、CustomerController、OrderController等不同的控制器吗?还是我错过了什么?
  • 我有一个控制器叫做FilterController。我创建一个的原因是我知道我将需要一个 get 方法并创建多个控制器,每个控制器只包含一个方法,每个控制器似乎太多而太少。

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


【解决方案1】:

您应该为每个资源(实体)设置不同的控制器

然后在 CustomersController 上使用 Get 方法,例如

您的网址将是

/公司
/客户
/订单

等等……

然后,您的 HTTP 动词会被路由到这些控制器中的相应方法。因此,GET/Customers 的请求将被路由到该控制器上的 Get() 方法

或者,如果您真的坚持使用一个控制器,您可以使用属性路由以及动词属性

类似

public class FilterController : ApiController
{
    [HttpGet]
    [Route("orders")]
    public IHttpActionResult GetOrders()
    { }


    [HttpGet]
    [Route("customers")]
    public IHttpActionResult GetCustomers()
    { }


    [HttpPut]
    [Route("customers")]
    public IHttpActionResult UpdateOrders()
    { }
}

但这会变得很大,很快,我一般不建议这样做。

每个资源一个控制器更干净。

【讨论】:

  • 请看我上面的cmets。对于我的另一个关于更新资源的问题,我有一个控制器。根据您的建议,我应该只有一种 PUT 方法,在该方法中我应该有一些逻辑,我需要确定是运行一个逻辑路径还是另一个逻辑路径?我明白你的观点,做这样的事情将是纯粹的,但这种方法不会做太多,好像我有两种方法来表示不同的更新场景,它更简洁。在同一个控制器上使用两个 put 方法而不是一个方法有什么缺点。
  • 缺点是可读性。如果每个资源有一个控制器,则导航代码会容易得多。如果您想更改与更新客户有关的某些内容,您知道转到 CustomersController... 会提高可读性。
  • 谢谢亚历克斯。我确实做到了(即上面的 FilterController),但我不确定这是否是正确的做法,你已经回答了这个问题。我想对于我的简单案例,我会采用一种控制器方法,因为它不是很干净,也可能不是很安静。
  • 还是可以restful的,用属性路由的方式:)
猜你喜欢
  • 2018-07-08
  • 2015-12-13
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2012-09-05
相关资源
最近更新 更多