C # REST API Controller: один и тот же маршрут с двумя различными действиями - PullRequest
0 голосов
/ 21 марта 2019

При использовании следующих маршрутов:

        config.Routes.MapHttpRoute(
            name: "new_device",
            routeTemplate: "api/v1/devices",
            defaults: new { controller = "Devices", action = "new_device" }
        );

        config.Routes.MapHttpRoute(
            name: "devices_list",
            routeTemplate: "api/v1/devices",
            defaults: new { controller = "Devices", action = "devices_list", httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
        );

Контроллер выглядит следующим образом:

public class DevicesController : ApiController
{
    [HttpPost]
    [ResponseType(typeof(IHttpActionResult))]
    [Route("api/v1/devices")]
    [ActionName("new_device")]
    [ValidateModel]
    public IHttpActionResult NewDevice([System.Web.Http.FromBody] Device device )
    {
         ...
    }

    [HttpGet]
    [ResponseType(typeof(IHttpActionResult))]
    [Route("api/v1/devices")]
    [ActionName("devices_list")]
    [ValidateModel]
    public List<Device> GetAllDevices()
    {
        ...
    }

Я ожидаю, что маршрутизатор найдет правильный маршрут на основе используемого HttpMethodтак как даже он использует тот же URI, он использует другой HttpMethod.

Но вместо этого происходит сбой со следующим:

"Сообщение": "Запрошенный ресурс не поддерживает http-метод" GET "."

Я предполагаю, что он сопоставляет совпадение с URI, а затем проверяет, является ли метод одинаковым.

Есть ли способ добиться, используя тот же URI с другим методом Http, которыйкак руководствоваться REST?Я что-то упустил?

1 Ответ

2 голосов
/ 21 марта 2019

Хорошо, я проверяю весь ваш код. Я думаю, что вы пытаетесь выполнить вызовы сложным способом.

Следующий код предназначен для конфигурации:

public static void Register(HttpConfiguration config)
{
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/v1/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
}

и следующий код вашего контроллера:

public class DevicesController : ApiController
{
    [HttpPost]
    [ResponseType(typeof(IHttpActionResult))]       
    [ActionName("newDevice")]

    public IHttpActionResult NewDevice([System.Web.Http.FromBody] Device device)
    {
        return null;
    }

    [HttpGet]
    [ResponseType(typeof(IHttpActionResult))]        
    [ActionName("devices_list")]

    public List<Device> GetAllDevices()
    {
        return null;
    }
}

Я удалил ValidateModel. Я думаю, что это ваш собственный атрибут или как-то связанный со встроенным пакетом nuget.

В любом случае, выполняйте звонки с помощью Почтальона или любого HTTP-клиента. Это должно работать, как это работало на моем конце с вышеупомянутым кодом.

Примеры вызовов:

https://localhost:44370/api/v1/devices/devices_list => Получить.
https://localhost:44370/api/v1/devices/newDevice => Пост. Предоставить тело как почтовый вызов для объекта.

...