我应该创建多个控制器还是具有多个操作的单个控制器来处理更详细的响应

本文关键字:控制器 处理 响应 单个 创建 我应该 操作 | 更新日期: 2023-09-27 17:57:12

这是一个关于Web api设计的问题。假设我有一个返回城市和城市属性(如人口、FIPS 代码和区域)的方法。还有更多的属性,通常是 20+。

在某些情况下,我会提交 FIPS 代码,并希望返回城市名称。其他时候,我会提交一个 FIPS 代码,并期望返回一些其他属性(可能是区域和人口)。

我的问题是,我应该如何为这些场景构建控制器和操作?我应该有一个名为 City 的控制器和一系列方法来准确返回我需要的内容,还是应该使用多个控制器?

我对 Web api 设计相当陌生,但有一个控制器感觉更干净。我的想法是一个名为City的控制器,具有适当命名的操作,例如GetNameAndPopulationFromFipsCode()或类似的东西。

我应该创建多个控制器还是具有多个操作的单个控制器来处理更详细的响应

资源是相同的,所以实际上它通常是同一个控制器。

我看到了 2 种自然的实现方式:

  1. 内容协商
  2. 客户端传递可选参数以获取完整视图模型

首先是更 RESTful,但考虑到 Web API 中当前基于键的 conneg,可能会有点痛苦。

二是更容易实现:

// almost pseudocode !!
// called by /api/City/123?extended=true
public City Get(int id, bool? extended)
{
   ExtendedCity city = GetCity(id);
   return extended.HasValue && extended.Value ? MapTo(city) : city;
}
// ----
public class City
{
   ...
}
public class ExtendedCity : City
{
   ...
}

更新

正如@Darrel指出的,查询字符串参数会更改资源。但在资源组织方面,它保持层次结构,这就是为什么是首选方法的原因。