空响应返回204

Cal*_*ale 8 c# asp.net-core asp.net-core-2.1

当我执行GET请求并且找不到任何数据时,控制器返回204。

[Route("user/v1/[controller]")]
public class UserLoginController : Controller
{
    [HttpGet]
    public async Task<UserLogin> Get(int userId)
    {
        var userLoginLogic = new UserLoginLogic();

        return await userLoginLogic.GetUserLogin(userId);
    }
}
Run Code Online (Sandbox Code Playgroud)

这仅用于GET请求,POST,PUT,DELETE返回20​​0空响应。这与我的招摇定义相混淆,后者的定义为200响应,我宁愿保持一致。

如果我通过此控制器提供HTML,但204用于REST API,则204会很好。

我如何得到它返回200?

Nko*_*osi 8

使用ActionResult<T>v2.1 +中的新功能,您还可以重构以专门告诉控制器使用Ok()辅助方法返回Ok 200

[Route("user/v1/[controller]")]
public class UserLoginController : Controller {
    [HttpGet]
    public async Task<ActionResult<UserLogin>> Get(int userId) {
        var userLoginLogic = new UserLoginLogic();
        var model = await userLoginLogic.GetUserLogin(userId);
        return Ok(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果实际上没有要返回的内容,这可能会产生误导。考虑使用适当的响应状态

[Route("user/v1/[controller]")]
public class UserLoginController : Controller {
    [HttpGet]
    public async Task<ActionResult<UserLogin>> Get(int userId) {
        var userLoginLogic = new UserLoginLogic();
        var model = await userLoginLogic.GetUserLogin(userId);
        if(model == null) return NotFound(); //404
        return Ok(model); //200
    }
}
Run Code Online (Sandbox Code Playgroud)

如果打算返回200 Ok而没有内容使用ControllerBase.Ok()方法

创建一个OkResult对象,该对象产生一个空的Status200OK响应。

[Route("user/v1/[controller]")]
public class UserLoginController : Controller {
    [HttpGet]
    public async Task<ActionResult<UserLogin>> Get(int userId) {
        var userLoginLogic = new UserLoginLogic();
        var model = await userLoginLogic.GetUserLogin(userId);
        if(model == null) return Ok(); //200 with no content
        return Ok(model); //200
    }
}
Run Code Online (Sandbox Code Playgroud)

ASP.NET Core Web API中的参考控制器操作返回类型:

  • 这就是为什么我问使用v2.1的原因,它也有可爱的新`ActionResult &lt;T&gt;`。 (3认同)
  • `Ok(null)`生成204。相反,如果您坚持使用200而不是此答案的建议404,则需要显式检查`null'并使用简单的`Ok()`:这仅意味着切换在此答案的第二个示例中,将`NotFound()`替换为`Ok()`。 (3认同)

McK*_*bue 7

看:


services.AddControllers(opt =>  // or AddMvc()
{
    // remove formatter that turns nulls into 204 - No Content responses
    // this formatter breaks Angular's Http response JSON parsing
    opt.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
})
Run Code Online (Sandbox Code Playgroud)