0

我正在开发一个 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://localhost:puerto/Api/Registros/registro的 HTTP-POST (不带可选参数),服务器会返回 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”的参数为空,我有 5此类中的属性,并且全部为空。

一种方式返回 404,另一种方式返回空参数...我能做什么?我做错了什么?

4

1 回答 1

0

如果我尝试执行http://localhost:puerto/Api/Registros/registro的 HTTP-POST (不带可选参数),服务器会返回 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
}

结果:

在此处输入图像描述

于 2019-03-04T05:50:55.617 回答