如何设计多种方式来调用REST API

时间:2019-05-02 16:36:57

标签: rest asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

我正在使用ASP.NET Web API。我想成为uri

GET /api/v1/documents/1234/download

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

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

是否可以有多种方法来调用REST API网址?推荐吗?

我仅使用Attribute Routes

[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);
    }
}

使用上面的代码,只有GET /api/v1/documents/1234?act=download有效。是否可以通过这样的方式配置路由,使得所有3条路由都将调用相同的操作方法?

1 个答案:

答案 0 :(得分:1)

您可以为每种方法添加所需数量的Route属性。
因此,您可以对自己的方法执行此操作:

[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

我个人认为这是一个漫长的过程,会尝试坚持一种样式(如果可以的话,请选择最后一种样式),但我想这可能取决于您的要求。