REST API HttpPost это меня подводит - PullRequest
0 голосов
/ 03 марта 2019

Я разрабатываю REST API и у меня возникает проблема при попытке доступа через HTTP-POST.

В моем проекте в «ApiAreaRegistration» у меня есть это определение:

context.MapRoute(
            "AccesoRegistro",
            "Api/Registros/Registro/{email}/{fecha}", 
            new
            {
                controller = "Registros", 
                action = "Registro", 
                email = UrlParameter.Optional,
                fecha = UrlParameter.Optional
            }
        );

«email» и «fecha» являются необязательными параметрами.

В mi «RegistroController» я определил:

 public JsonResult Registro(int? id, Registro reg)
{
    switch (Request.HttpMethod)
    {
        case "POST": 
            return Json(registroManager.InsertarRegistroComidas(reg));
        case "GET": 
            return Json(registroManager.ObtenerRegistros(reg.email, reg.fecha),
                JsonRequestBehavior.AllowGet);
    }
    return Json(new { Error = true, Message = "Operación HTTP desconocida" });
}

Я хочу использовать только методы POST и GET.Я тестирую с плагином Firefox под названием «RESTED», и когда я использую HTTP-GET, он работает нормально.Я получаю доступ к REST с помощью метода Get, используя: http://localhost:puerto/Api/Registros/registro/email/12-12-2000. REST возвращает мне ожидаемое значение.

Если я попытаюсь выполнить HTTP-POST, выполнив http://localhost:puerto/Api/Registros/registro (без дополнительных параметров), сервер вернет мне ошибку 404: «Ресурс не найден».Я устанавливаю точку останова внутри метода Controller, в предложении switch (), и когда я пытаюсь получить доступ с помощью HTTP-POST, никогда не выполняю этот метод.

public JsonResult Registro(int? id, Registro reg)
{
    switch (Request.HttpMethod) <-- Here i set the breakpoint
    {
        case "POST": 
            return Json(registroManager.InsertarRegistroComidas(reg));
        case "GET": 
            return Json(registroManager.ObtenerRegistros(reg.email, reg.fecha),
                JsonRequestBehavior.AllowGet);
    }
    return Json(new { Error = true, Message = "Operación HTTP desconocida" });
}

Я пытаюсь сделать это, задав настройку [HttpPost] над методом, подобным этому:

 [HttpPost]
    public JsonResult InsertarRegistro(Registro reg)
    {
              return Json(registroManager.InsertarRegistroComidas(reg));
    }

И я определил этот путь в ApiAreaRegistration:

context.MapRoute(
        "AccesoInsertarRegistro",
        "Api/InsertarUnRegistro",
        new
        {
            controller = "Registros",
            action = "InsertarRegistro",
        }
    );

В RESTED, если я делаю HTTP-POST, используя http://server:port/api/insertarunregistro со всеми необходимыми параметрами, метод "InsertarRegistro" выполняется, но параметр "Registro reg" равен нулю, у меня 5 атрибутов в этом классе, и все равно нулю.

Один из способов возвращает мне404, другой способ возвращает мне нулевые параметры ... Что я могу сделать?Что я делаю не так?

1 Ответ

0 голосов
/ 04 марта 2019

Если я попытаюсь выполнить HTTP-POST, выполнив http://localhost:puerto/Api/Registros/registro (без дополнительных параметров), сервер вернет мне ошибку 404: «Ресурс не найден».Я устанавливаю точку останова внутри метода Controller, в предложении switch (), и когда я пытаюсь получить доступ с помощью HTTP-POST, никогда не выполняю этот метод.

Я полагаю, у вас есть правило перезаписи двух URL вваше приложение, одно из них - правило AccesoRegistro, другое - правило по умолчанию.

Правило по умолчанию, как показано ниже:

        routes.MapRoute(
         name: "Default",
         url: "{controller}/{action}/{id}",
         defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );

Так что http://localhost:puerto/Api/Registros/registro сначала будет соответствовать правилу по умолчанию "{controller} / {action} / {id} "не правило AccesoRegistro, оно вернет ошибку 404.

Я предлагаю вам поставить правило AccesoRegistro перед правилом Default, тогда оно будет работать хорошо.

Как показано ниже:

    routes.MapRoute(
     name: "Default",
     url: "{controller}/{action}/{id}",
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
 );

    routes.MapRoute(
"AccesoRegistro",
"Api/Registros/Registro/{email}/{fecha}",
new
{
    controller = "Registros",
    action = "Registro",
    email = UrlParameter.Optional,
    fecha = UrlParameter.Optional
}

Результат:

enter image description here

...