如何设计多种调用RESTAPI的方法

如何设计多种调用RESTAPI的方法,rest,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,Rest,Asp.net Web Api,Asp.net Web Api2,Asp.net Web Api Routing,我正在使用ASP.NET Web API。我想休息一下 GET/api/v1/documents/1234/download或 GET/api/v1/documents/1234?act=download或 GET/api/v1/documents?id=1234&act=download 可以有多种方法调用RESTAPI Url吗?推荐吗 我仅使用属性路由 [RoutePrefix("api/v1")] public class DocumentController : ApiControll

我正在使用ASP.NET Web API。我想休息一下

GET/api/v1/documents/1234/download

GET/api/v1/documents/1234?act=download

GET/api/v1/documents?id=1234&act=download

可以有多种方法调用RESTAPI Url吗?推荐吗

我仅使用
属性路由

[RoutePrefix("api/v1")]
public class DocumentController : ApiController
{
    private readonly DomainService _domainService;

    public DocumentController(DomainService domainService)
        : base(domainService)
    {
        _domainService = domainService ?? throw new ArgumentNullException(nameof(domainService));
    }

    [HttpGet]
    [Route("documents/{id:int}")]
    public async Task<IHttpActionResult> DownloadDocument([FromUri]int id, [FromUri]string act)
    {
        if (string.IsNullOrEmpty(act) || act.ToUpper() != "DOWNLOAD")
        {
            return BadRequest("Invalid action parameter.");
        }

        return await service.DownloadFile(id);
    }
}
[RoutePrefix(“api/v1”)]
公共类DocumentController:ApicController
{
私有只读域服务\u域服务;
公共文档控制器(域服务域服务)
:base(域服务)
{
_domainService=domainService??抛出新的ArgumentNullException(nameof(domainService));
}
[HttpGet]
[路由(“documents/{id:int}”)]
公共异步任务下载文档([FromUri]int-id,[FromUri]string-act)
{
if(string.IsNullOrEmpty(act)| | act.ToUpper()!=“下载”)
{
返回BadRequest(“无效的操作参数”);
}
返回等待服务。下载文件(id);
}
}

仅使用上述代码
GET/api/v1/documents/1234?act=download
works。是否可以将路由配置为所有3个路由都将调用相同的操作方法?

您可以根据需要向每个方法添加任意多个
路由属性。
因此,您可以对您的方法执行以下操作:

[Route("documents")]                 // matches /documents?id=123&act=download
[Route("documents/{id:int}")]        // matches /documents/123?act=download
[Route("documents/{id:int}/{act}")]  // matches /documents/123/download
就我个人而言,我认为这是相当冗长的,并会尽量坚持一个单一的风格(最后一个,如果我可以选择),但我想这可能取决于你的要求