.Net Core 2.2 Web API 路由

3

我有以下的控制器,我想要把它用作Web API控制器,通过ajax进行帖子以从我的用户表中检索数据。

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控制器?我的路由是否错误?
提前感谢。

1
我同意API中的命名很令人困惑。但我认为API的重点在于控制器的名称是您期望从中获取的内容,因此您只有一个获取操作(方法的名称除了“get”之外并不重要),否则会更加混乱。您需要为其他获取操作编写另一个控制器。但您还可以使用获取特定数字的重载选项,例如:/api/users/3。 - Johan Herstad
2个回答

13

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

该模板明确表明您只关心控制器的名称。在您的示例中,GetInstitutionNamesById 是操作的名称,而该模板不考虑该名称。

有几个选项可以实现您在此处要求的内容:

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

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

该选项适用于控制器内的所有操作。

  • HttpGet约束属性更改为隐式指定操作:

  • [HttpGet("[action]")]
    

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

  • HttpGet约束属性更改为明确指定操作:

  • [HttpGet("GetInstitutionNamesById")]
    

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

    关于在此处正确使用路由的问题 - 这在某种程度上是基于观点的。一般来说,API 试图成为 RESTful,使用与资源匹配的路由模板等。使用这种方法,您可能会有类似以下内容的东西:

    /api/Users/{userId}/InstitutionNames
    
    在这种情况下,您可能会有一个单独的InstitutionNames控制器,或者将其捆绑到Users控制器中。确实有许多方法可以做到这一点,但我不会在这里介绍更多内容,因为这有点偏题和基于个人看法。

    2
    最初的回答:你只需要按照这种方式命名它。
        [HttpGet("[action]/{id}")]
        public List<string> GetInstitutionNamesById(int id)
        {
            // returns desired list
        }
    

    "最初的回答" 翻译成英文是 "Original Answer"。关于 IT 技术方面的内容,您想要翻译的是从 ajax 调用 /api/users/GetInstitutionNamesById/1 返回的内容。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接