【问题标题】:Calling a Web API action that has same signature as another调用与另一个签名相同的 Web API 操作
【发布时间】:2017-12-10 11:59:39
【问题描述】:

我有一个 ASP .Net Core 1.1 Web Api。在我的一个控制器中,我想要两个操作:

[HttpGet("{userId:int}")]
public async Task<IActionResult> GetUser([FromRoute] int id)
{
    return Ok(_context.User.Where(u.Id == id));
}

[HttpGet("{groupId:int}")]
public async Task<IActionResult> GetUsersInGroup([FromRoute] int groupId)
{
    return Ok(_context.User.Where(u.GroupId == groupId));
}

除了方法名称之外,这两个操作都具有相同的签名。我怎样才能做到这一点,以便我可以调用其中一个或另一个?

谢谢...

【问题讨论】:

    标签: controller asp.net-core-mvc action asp.net-core-webapi asp.net-core-1.1


    【解决方案1】:

    从路由组件的角度考虑。如果收到/api/users/123 之类的 URL,并且您在控制器中有上述操作,您会怎么做?

    您必须区分它们,例如属性:

    [Route("api/users")]
    public class UsersController : Controller
    {
        [HttpGet("{userId:int}")]
        public async Task<IActionResult> GetUser([FromRoute] int userId)
        {
            return Ok(_context.User.Where(u.Id == userId));
        }
    
        [HttpGet("group/{groupId:int}")]
        public async Task<IActionResult> GetUsersInGroup([FromRoute] int groupId)
        {
            return Ok(_context.User.Where(u.GroupId == groupId));
        }
    }
    

    现在可以通过以下方式访问它们:

    • /api/users/123
    • /api/users/group/123

    控制器级路由属性为所有路由设置一个公共前缀,因此您无需为所有路由指定它。

    然后 HttpGet 属性指定一个附加前缀,因此它们是根本不同的路由。

    【讨论】:

    • 出于好奇,是否可以使用查询字符串?如果是这样,它会被认为是“不安”吗?例如“/api/users/123”获取特定用户,“/api/users?groupId=5”获取组内所有用户...
    • 这也是可能的。您可以使用 FromQuery 属性 IIRC 来获取查询值。我不认为这是明显的 unRESTful,因为您正在查找用户但有一个搜索参数。另一种选择可能是将路由设置为/api/users/123 和/api/groups/123/members。使用适合您和使用 API 的任何人的任何东西。
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2019-01-18
    • 2021-01-29
    相关资源
    最近更新 更多