REST API подпись функций - PullRequest
       4

REST API подпись функций

0 голосов
/ 16 января 2019

Я хотел бы позвонить в браузере / api / announce и / api / announce / 1. Получение ошибки с помощью следующих функций Get. Когда я закомментирую одну или другую работу, но если у меня есть обе функции, GET работает не так, как ожидалось. Что-то не так с подписями или что-то еще?

   /api/announce
   [HttpGet]
    public List<Announcement> GetAnnouncements()
    {

        Services.Interface.IAnnouncementService service = new Services.Imp.AnnouncementService(_configuration, _logger);

        Announcements announcements = service.GetAnnouncements(1, 1);
        return announcements;

    }

    /api/announce/1
    [HttpGet]
    public ActionResult<Announcement> GetAnnouncements([FromQuery]int ID)
    {

        Services.Interface.IAnnouncementService service = new Services.Imp.AnnouncementService(_configuration, _logger);

        Announcement announcement = service.GetAnnouncement(ID);
        return announcement;

    }

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Подписи одинаковы для ваших правил маршрутизации, поэтому будет выдано это исключение: Microsoft.AspNetCore.Mvc.Internal.AmbiguousActionException: Multiple actions matched.

Чтобы структура могла понять, какое действие вы хотите вызвать, вы должны быть более конкретными в отношении маршрутизации. И если вы хотите передать параметр как часть пути, вы должны изменить атрибут [FromQuery] на атрибут [FromRoute].

Пример:

  [HttpGet]
  public IActionResult Test()
  {
    return Ok();
  }

  [HttpGet("{id}")]
  public IActionResult Test([FromRoute]int id)
  {
    return Ok();
  }
0 голосов
/ 16 января 2019

Вот как мне нравится это делать:

    [HttpGet]
    [ProducesResponseType(typeof(IList<Currency>), 200)]
    public async Task<IActionResult> GetAll()
    {
        return Ok(await _typeService.GetCurrenciesAsync().ConfigureAwait(false));
    }

    [HttpGet("{id}", Name = "GetCurrency")]
    [ProducesResponseType(typeof(Currency), 200)]
    public async Task<IActionResult> Get([FromRoute]int id)
    {
        return Ok(await _expenseService.GetCurrencyAsync(id).ConfigureAwait(false));
    }

Мы можем видеть в чванстве что-то вроде этого:

/api/Currency
/api/Currency/{id}

Ваш базовый контроллер может быть примерно таким, чтобы включать базовый маршрут:

[Authorize(Policy = Common.Security.Policies.ApiUser)]
[Route("api/[controller]")]
[Benchmark, ApiController]
public abstract class BaseController : ControllerBase
{
    protected BaseController()
    { }
}

Вот конструктор контроллера для полноты:

public class CurrencyController : BaseController
{
    private readonly IExpenseEntryService _expenseService;
    private readonly ITypeService _typeService;

    public CurrencyController(ITypeService typeService, IExpenseEntryService expenseService)
    {
        _expenseService = expenseService;
        _typeService = typeService;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...