从技术上讲,这两种方法之间没有区别。
如果你想查看OkObjectResult
的代码,那么你会发现OkObjectResult
是一个设置了200状态码的ObjectResult
,而默认情况下ObjectResult
已经设置了200状态码。
对我来说唯一的区别在于代码可读性以及你或你的团队的个人喜好。这一切都取决于命名和你想要强调的意图。
return Ok(myResult); // gives emphasis on status, my personal favorite
return new OkObjectResult(myResult); // for me a little bit verbose and the same
// effect as Ok; but states we return an Object
return new ObjectResult(myResult); // gives emphasis of the content that is returned
return myResult
以下是来自当前教程页面的相关示例和解释:
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
todoItem
不是ActionResult<TodoItem>
类型,而是TodoItem
类型。为什么编译器没有报错? - Joerg我只能看到依赖于某些默认值和显式提供该值之间的差异 - 后者通常更好,使用OkObjectResult
(或显式设置StatusCode
)可以使您的意图更加清晰,这非常重要。
ObjectResult
没有默认的StatusCode
,实际上默认值为null。但是,HttpResponse
有默认状态码200,因此无论如何都能正常工作。
return Ok(myResult)
和return myResult
之间有区别!Ok(myResult)
时:
返回的ActionResult
对象的Result
属性将被填充。因此,您可以基于它编写断言。例如:[Fact]
public async Task GetArticle_ArticleIsNotNull_ReturnsOkObjectResult()
{
// Arrange
const int number = 1;
_articleRepository.GetArticleAsync(number).Returns(new Article());
// Act
var result = await _articleController.GetArticle(number);
// Assert
result.Result.Should().BeOfType<OkObjectResult>();
}
但是,如果你只使用return myResult
:在单元测试期间,Result
属性仍然为null
!