【问题标题】:.Net Core 2.2 Web API Routing.Net Core 2.2 Web API 路由
【发布时间】:2019-08-06 06:35:15
【问题描述】:

我有以下控制器,我想将其用作 ajax 帖子的 Web API 控制器,以从我的用户表中检索数据。

namespace MyProjectName.Controllers.API
{
    [Route("api/[controller]")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        private readonly myContext _context;
        public UsersController(myContext context)
        {
            _context = context;
        }

        [HttpGet]
        public List<string> GetInstitutionNamesById(int id)
        {
            // returns desired list
        }
    }
}

现在我希望这个函数的路由是这样的:/api/users/getinstitutionnamesbyid 但显然它似乎只是 /api/users 哪个我真的很困惑(如果我添加额外的 HttpGet 函数会怎样?)。

谁能解释我做错了什么?我使用 Web Api 控制器不是预期的方式吗?我的路由错了吗?

提前致谢。

【问题讨论】:

  • 我同意 api 中的命名令人困惑。但我认为 api 的重点是控制器的名称是您期望从中获得的名称,因此您实际上只有一个 get 操作(并且该方法的名称除了“get”之外不相关),否则如果会更加混乱。您需要为其他获取操作编写另一个控制器。但您也有获取特定数字的重载选项,例如:/api/users/3

标签: c# asp.net-core asp.net-core-mvc asp.net-web-api-routing asp.net-core-2.2


【解决方案1】:

[Route("api/[controller]")]

使用此模板,您明确声明您只关心控制器的名称。在您的示例中,GetInstitutionNamesByIdaction 的名称,模板不考虑该名称。

这里有几个选项可以实现您的要求:

  1. 更改您的 [Route] 模板以包含操作名称:

    [Route("api/[controller]/[action]")]
    

    此选项适用于控制器中的所有操作。

  2. 更改HttpGet 约束属性以指定动作隐式

    [HttpGet("[action]")]
    

    此选项确保您的操作方法的名称将始终用作路由 段。

  3. 更改HttpGet 约束属性以显式指定操作

    [HttpGet("GetInstitutionNamesById")]
    

    此选项允许您使用与操作方法本身的名称不同的路由段。

就您是否在此处以正确的方式使用路由而言 - 这在某种程度上是基于意见的。通常,您会看到 API 正在尝试使用 RESTful,使用匹配资源的路由模板等。使用这种方法,您可能会遇到以下情况:

/api/Users/{userId}/InstitutionNames

在这种情况下,您可能有一个单独的 InstitutionNames 控制器,或者您可以将它捆绑到 Users 控制器中。确实有很多方法可以做到这一点,但我不会在这里再谈这个,因为它有点离题和基于观点。

【讨论】:

    【解决方案2】:

    你只需要这样命名

        [HttpGet("[action]/{id}")]
        public List<string> GetInstitutionNamesById(int id)
        {
            // returns desired list
        }
    

    并从 ajax 调用 /api/users/GetInstitutionNamesById/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2018-08-28
      相关资源
      最近更新 更多