我正在开发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,另一种方式给我一个空参数...我该怎么办?我做错了什么?
如果我尝试做一个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
}
结果: