Как разработать несколько способов вызова REST API - PullRequest
0 голосов
/ 02 мая 2019

Я использую ASP.NET Web API. Я хочу, чтобы REST URI был

GET /api/v1/documents/1234/download или

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

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

Возможно ли иметь несколько способов вызова REST API Url? Это рекомендуется?

Я использую только 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 Ответ

1 голос
/ 03 мая 2019

Вы можете добавить столько атрибутов 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

Лично я считаю, что это довольно многословно, ипостараюсь придерживаться одного стиля (последний, если я смогу выбрать), но я думаю, это может зависеть от ваших требований.

...