.Net Core 2.2 Web API 路由
.Net Core 2.2 Web API Routing
我有以下控制器,我想将其用作 Web API 控制器,用于 ajax 帖子以从我的用户 table.
检索数据
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 控制器不是预期的方式吗?我的路线错了吗?
提前致谢。
[Route("api/[controller]")]
使用此模板,您明确声明您只关心控制器的名称。在您的示例中,GetInstitutionNamesById
是 操作 的名称,模板未考虑该名称。
有几个选项可以实现您在这里的要求:
更改您的 [Route]
模板以包含操作名称:
[Route("api/[controller]/[action]")]
此选项适用于您控制器中的所有操作。
更改 HttpGet
约束属性以隐式指定操作 :
[HttpGet("[action]")]
此选项确保您的操作方法的名称将始终用作路由
段.
更改 HttpGet
约束属性以明确指定操作 :
[HttpGet("GetInstitutionNamesById")]
此选项允许您使用不同于操作方法本身名称的路由段。
就您是否在此处以正确的方式使用路由而言 - 这在某种程度上是基于意见的。通常,您会看到 API 正在尝试 RESTful,使用匹配资源的路由模板等。使用这种方法,您可能会得到更类似于以下内容的内容:
/api/Users/{userId}/InstitutionNames
在这种情况下,您可能有一个单独的 InstitutionNames
控制器,或者您可以将其捆绑到 Users
控制器中。确实有很多方法可以做到这一点,但我不会在这里进一步讨论,因为它有点离题并且基于观点。
你只需要这样命名就可以了
[HttpGet("[action]/{id}")]
public List<string> GetInstitutionNamesById(int id)
{
// returns desired list
}
并从 ajax 调用 /api/users/GetInstitutionNamesById/1
我有以下控制器,我想将其用作 Web API 控制器,用于 ajax 帖子以从我的用户 table.
检索数据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 控制器不是预期的方式吗?我的路线错了吗?
提前致谢。
[Route("api/[controller]")]
使用此模板,您明确声明您只关心控制器的名称。在您的示例中,GetInstitutionNamesById
是 操作 的名称,模板未考虑该名称。
有几个选项可以实现您在这里的要求:
更改您的
[Route]
模板以包含操作名称:[Route("api/[controller]/[action]")]
此选项适用于您控制器中的所有操作。
更改
HttpGet
约束属性以隐式指定操作 :[HttpGet("[action]")]
此选项确保您的操作方法的名称将始终用作路由 段.
更改
HttpGet
约束属性以明确指定操作 :[HttpGet("GetInstitutionNamesById")]
此选项允许您使用不同于操作方法本身名称的路由段。
就您是否在此处以正确的方式使用路由而言 - 这在某种程度上是基于意见的。通常,您会看到 API 正在尝试 RESTful,使用匹配资源的路由模板等。使用这种方法,您可能会得到更类似于以下内容的内容:
/api/Users/{userId}/InstitutionNames
在这种情况下,您可能有一个单独的 InstitutionNames
控制器,或者您可以将其捆绑到 Users
控制器中。确实有很多方法可以做到这一点,但我不会在这里进一步讨论,因为它有点离题并且基于观点。
你只需要这样命名就可以了
[HttpGet("[action]/{id}")]
public List<string> GetInstitutionNamesById(int id)
{
// returns desired list
}
并从 ajax 调用 /api/users/GetInstitutionNamesById/1