ASP.NET Core Web API: маршрутизация по имени метода? - PullRequest
0 голосов
/ 12 июня 2019

Я помню из ASP.NET Web API, что достаточно префиксировать имена методов REST Web API с помощью HTTP-команд (например, GetList() => HTTP GET, Delete() => HTTP DELETE) для соответствующей маршрутизации входящих вызовов .

Я также помню, что в ASP.NET Web API происходит сопоставление параметров, поэтому даже Get(int id) и Get(int id, string name) автоматически и соответствующим образом маршрутизируются без каких-либо атрибутов.

public class MyController
{
  public ActionResult Get(int id) => ...

  public ActionResult Get(int id, string name) => ...

  public ActionResult DeleteItem(int id) => ...
}

Разве все это не доступно в ASP.NET Web API Core?

Ответы [ 3 ]

1 голос
/ 13 июня 2019

Ни перегрузками действий, ни префиксом имени действия нельзя было использовать как глагол Http. Способ маршрутизации в ASP.NET Core отличается от того, как это было в ASP.NET Web Api.

Однако вы можете просто объединить эти действия и затем перейти внутрь, поскольку все параметры являются необязательными, если вы отправляете как строку запроса

[HttpGet]
public ActionResult<string> Get(int id, string name)
{
  if(name == null){..}
  else{...}
}

Или вам нужно использовать атрибутную маршрутизацию, чтобы указать каждый API, если вы отправляете данные маршрута:

[HttpGet("{id}")]       
public ActionResult<string> Get(int id)
{
    return "value";
}


[HttpGet("{id}/{name}")]
public ActionResult<string> Get(int id, string name)
{
    return name;
}

См. Маршрутизация атрибутов , Web Api Core 2, различающие GET

0 голосов
/ 12 июня 2019

Вам просто нужно добавить маршрут в верхнюю часть вашего контроллера.

Укажите маршрут с помощью API, контроллера и действия:

[Route("api/[controller]/[action]")]
[ApiController]
public class AvailableRoomsController : ControllerBase
{
...
}
0 голосов
/ 12 июня 2019

Это доступно для Core 2, да, но способ, которым я знаю, как это сделать, выглядит примерно так

[Route("api/[controller]")]
[ApiController]
public class AvailableRoomsController : ControllerBase
{
    private readonly ApplicationContext _context;

    public AvailableRoomsController(ApplicationContext context)
    {
        _context = context;
    }

    // GET: api/AvailableRooms
    [HttpGet]
    public async Task<ActionResult<IEnumerable<AvailableRoom>>> GetAvailableRooms()
    {
        return await _context.AvailableRooms.ToListAsync();
    }


    // POST: api/AvailableRooms
    [HttpPost]
    public async Task<ActionResult<AvailableRoom>> PostAvailableRoom(AvailableRoom availableRoom)
    {
        _context.AvailableRooms.Add(availableRoom);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetAvailableRoom", new { id = availableRoom.Id }, availableRoom);
    }

    [HttpPut] .... etc
}

Теперь в зависимости от того, какое действие REST вы указываете, и какую модель вы используете.отправьте в «api / AvailableRooms», если соответствующее действие существует, оно будет выбрано.

Visual Studio 2019, и я думаю, что 2017 может создать контроллер, такой как этот, автоматически, если щелкнуть правой кнопкой мыши папку «Контроллеры» и выбрать «Добавить-> Контроллер», а затем выбрать «Контроллер API с действиями, используя Entity Framework» и выбрать одинваших классов модели.

...