繁体   English   中英

在Web API上调用post方法时获取404

[英]Getting 404 when calling a post method on Web API

我有一个具有标准GET,POST和Delete操作的API控制器。

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
    //Get
    [HttpPost]
    public async Task Post([FromBody] TestUser testUser, string tempPassword, role = "Guest")
    {

    }
}

现在,我使用以下命令添加新操作:

[HttpPost]
[Route("api/[controller]/UpdateRole")]
public async Task Post(string email, List<string> roles)
{
}

当我尝试使用邮递员调用API时,

类型:POST端点: http:// localhost / api / users / UpdateRole

要求正文:

{
    "email":"something@mail.com",
    "roles":["S1","s3"]
}

但是我得到了404作为回应。 在服务器上,我可以看到,

无需阅读整个请求正文即可完成应用程序。

由于RouteAttribute工作原理,您的总体路由似乎是/api/Users/api/Users/UpdateRoute

[Route("a")]
public class MyController
{
    [Route("a/b")]
    public IActionResult MyAction()
    {
    }
}

上面的路由为/a/a/b因为在这种情况下,操作路由会附加到控制器路由。

您的选择是:

  • 将控制器路由更改为[Route("[controller]/[action]")]并删除操作路由,在这种情况下,上例将变为/MyController/MyAction
  • 将操作路线更改为简单的[Route("b")] ,在这种情况下,完整路线将为a/b
  • 使用绝对路径作为操作路径[Route("/a/b")] ,在这种情况下,控制器路径将被忽略,而完整路径将只是/a/b

有关路由的更多信息,请参见此处

至于null值问题,ASP.NET Core当前期望将emailroles用作查询字符串参数。 相反,您应该为请求主体创建一个模型:

public class MyModel
{
    public string Email { get; set; }
    public List<string> Roles { get; set; }
}

然后更改您的操作以接受它:

[HttpPost]
[Route("api/[controller]/UpdateRole")]
public async Task Post([FromBody]MyModel model)
{

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM