Http get и post метод без имени атрибута - PullRequest
0 голосов
/ 05 ноября 2018

Я использую .net Core 2.1 Web API. Я добавляю каждый метод [HttpGet("....")] или [HttpPost("....")], как показано ниже. Но я не хочу писать каждый метод в каждом контроллере. Я хочу написать только [HttpGet] или [HttpPost]. Как мне этого добиться?

Или, если это невозможно, могу ли я сделать это как [HttpPost("[action]")] с автоматическим выполнением actionName?

Я звоню так: http://localhost:5000/api/University/GetUniversities

Это прекрасно работает

namespace University.API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UniversityController : ControllerBase
    {
        private readonly IUniversityService universityService;

        public UniversityController(IUniversityService universityService)
        {
            this.universityService = universityService;
        }

        [HttpGet("GetUniversities")]
        public async Task<ServiceResult> GetUniversities()
        {
            return await universityService.GetUniversities();
        }

        [HttpGet("GetUniversityStatues")]
        public async Task<ServiceResult> GetUniversityStatues()
        {
            return await universityService.GetUniversityStatues();
        }
    }
}

Я пробовал это, но не работает:

namespace University.API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UniversityController : ControllerBase
    {
        private readonly IUniversityService universityService;

        public UniversityController(IUniversityService universityService)
        {
            this.universityService = universityService;
        }

        [HttpGet]
        public async Task<ServiceResult> GetUniversities()
        {
            return await universityService.GetUniversities();
        }

        [HttpGet]
        public async Task<ServiceResult> GetUniversityStatues()
        {
            return await universityService.GetUniversityStatues();
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Веб-API, такой как MVC, имеет соглашение о конфигурации, поэтому, если вы не определили конечную точку в атрибуте, она будет работать, но не так, как вы ожидаете. Как правило, метод Get будет вызываться так же, как этот метод api / [ControllerName] post.

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

[Route("[controller]/[action]")]
0 голосов
/ 05 ноября 2018

Вы можете использовать только [HttpGet]

    [HttpGet]
    public async Task<ServiceResult> GetUniversities()
    {
        return await universityService.GetUniversities();
    }

А затем отправьте запрос на получение http://localhost:5000/api/University. Он будет работать нормально. Но ваша проблема в том, что у вас есть несколько методов получения без параметров. тогда он не может определить, какой метод get вам нужно вызвать.

Так что, если вы действительно хотите использовать два метода get без параметров в одном контроллере, вы должны украсить его следующим образом:

   [HttpGet("GetUniversities")]
   public async Task<ServiceResult> GetUniversities()
   {
       return await universityService.GetUniversities();
   }

   [HttpGet("GetUniversityStatues")]
   public async Task<ServiceResult> GetUniversityStatues()
   {
       return await universityService.GetUniversityStatues();
   }

В противном случае вы должны переместить второй на другой контроллер

0 голосов
/ 05 ноября 2018

Не обязательно передавать имя метода с помощью глагола Http. Вы также можете использовать как это:

        [HttpGet]
        public async Task<ServiceResult> GetUniversities()
        {
            return await universityService.GetUniversities();
        }

Но вы хотите изменить имя метода или маршрут. Вы можете что-то вроде этого:

        [HttpGet("", Name="Students"]
        public async Task<ServiceResult> GetStudents()
        {
            return await universityService.GetStudents();
        }
...