REST API HttpPost让我失望了

问题描述 投票:0回答:1

我正在开发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方法。我正在使用名为“RESTED”的firefox插件进行测试,当我使用HTTP-GET时,它运行正常。我使用get方法访问REST: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://server:port/api/insertarunregistro进行HTTP-POST,则执行方法“InsertarRegistro”,但“Registro reg”的参数为null,我在此类中有5个属性,并且全部为null。

一种方式给我一个404,另一种方式给我一个空参数...我该怎么办?我做错了什么?

c# visual-studio rest iis http-post
1个回答
0
投票

如果我尝试做一个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规则,然后它将运行良好。

如下所示:

    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

© www.soinside.com 2019 - 2024. All rights reserved.