Ok()vs Ok(空)

时间:2018-09-10 14:53:06

标签: asp.net-mvc asp.net-core asp.net-core-webapi

Ok()Ok(null)有什么区别?

Ok(null)返回状态代码 204 ,除了标头外没有其他内容,因此我们必须以这种方式更改代码:

[HttpGet]
public IActionResult GetTest(string test)
{
    MyClass result = GetMyClass(test)
    if(result == null) return Ok();
    return Ok(result);
}

3 个答案:

答案 0 :(得分:1)

官方文件说

  

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

     

Ok(Object)创建一个OkObjectResult对象,该对象生成一个   Status200OK响应。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllerbase.ok?view=aspnetcore-2.1

传递null时,它将创建一个null的OkObjectResult,因此您将获得204状态代码。

答案 1 :(得分:1)

HTTP状态码204是有效的“成功”结果,它使接收者知道没有内容。实际上,这似乎很合适,但可能并非所有地方都支持。

您可以“教”(或编程)收件人以正确处理它,或者您需要应用解决方法。

如果您需要在多个地方解决此问题,则可以使用基类重载Ok()(或更准确地说,重新定义它)以始终执行所需的操作,如下所示:

public abstract class MyBaseApiController : ApiController
{
    public new IHttpActionResult Ok<T>(T content)
    {
        if (content == null) return base.Ok();
        return base.Ok(content);
    }
}

答案 2 :(得分:0)

我建议您使用NoContent(HTTPStatus 204),这意味着请求已成功执行,但未返回值或对象,并且它是用于此目的的正式状态代码,如下所示:

[HttpGet()]
public IActionResult GetTest(string test)
{
    MyClass result = GetMyClass(test)
    if(result != null) return Ok(result);
    return NoContent();
}

希望您会发现这很有用。