Controller methods return ActionResult 的原因是什么? (ASP.NET 核心网站 API)
What's the reason why Controller methods return ActionResult? (ASP.NET Core Web API)
我对 Web API 还很陌生。我观察到一些方法 return 和 ActionResult
。这是为什么?例如, return 代替 CustomerDto
还不够吗?
返回 ActionResult 不会提供有关正在 returned 的实际对象的任何线索。我错过了什么吗?
有多种设计 Web 的方法 API。在您的情况下,您可以 return CustomerDto。根据文档 (https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results),Web API 控制器操作可以 return 以下任何一项:
- 空白
- HttpResponseMessage
- IHttpActionResult
- 一些其他类型
通过使用IHttpActionResult,您可以更好地控制Http Reponse代码。
Web API 是一个灵活的平台 - 您可以编写简单的 APIs,它始终只是 return 特定的结果类型(例如您的 CustomerDto
),或者您可以编写更复杂的 API 真正关心 HTTP 语义并希望更好地控制状态代码、其他 HTTP headers 等
或者您的方法可能正在处理 "resources",它具有更复杂的表示形式,无法通过 C# 中的 单个 DTO class 轻松建模,所以你想要多个可能的灵活性 "return types".
如果您不想要那种级别的控制,是的,您可以继续 return 您的 DTO 类型。没有人(据我所知)强迫您改用 ActionResult
。
在 ASP.NET Core 中,前 MVC "Controller"-class 和 Web Api "ApiController"-class 合并到一个 "Controller"-class。
ActionResult 方法,这是一个 classic MVC 方法,在构建 MVC 应用程序时很有用,它也包含在合并中,这就是为什么
它在构建 Web Api.
时可用
如果您注意到.net core web 的预构建项目api,并非所有功能return ActionResult
或IActionResult
。所以是的,你完全可以 return 像 CustomerDto
这样的东西。通过这种方式,您可以 return 对象 json,状态代码为 200。但是,假设您的操作正在接受一些输入,您并不总是确定是否会有有效输出。在这种情况下,您将希望 return 状态代码仅在成功时为 200,如果用户发送了无效数据或任何其他状态代码则为 400(badRequest)。这是处理http请求的标准方式。
因此,通过使用 IActionResult
,您可以使用 return Json(customer)
或 return Ok(customer)
return 一个 CustomerDto
对象,或者您可以 return 当你 运行 出错时使用 BadRequest(myErrors)
。
我对 Web API 还很陌生。我观察到一些方法 return 和 ActionResult
。这是为什么?例如, return 代替 CustomerDto
还不够吗?
返回 ActionResult 不会提供有关正在 returned 的实际对象的任何线索。我错过了什么吗?
有多种设计 Web 的方法 API。在您的情况下,您可以 return CustomerDto。根据文档 (https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results),Web API 控制器操作可以 return 以下任何一项: - 空白 - HttpResponseMessage - IHttpActionResult - 一些其他类型
通过使用IHttpActionResult,您可以更好地控制Http Reponse代码。
Web API 是一个灵活的平台 - 您可以编写简单的 APIs,它始终只是 return 特定的结果类型(例如您的 CustomerDto
),或者您可以编写更复杂的 API 真正关心 HTTP 语义并希望更好地控制状态代码、其他 HTTP headers 等
或者您的方法可能正在处理 "resources",它具有更复杂的表示形式,无法通过 C# 中的 单个 DTO class 轻松建模,所以你想要多个可能的灵活性 "return types".
如果您不想要那种级别的控制,是的,您可以继续 return 您的 DTO 类型。没有人(据我所知)强迫您改用 ActionResult
。
在 ASP.NET Core 中,前 MVC "Controller"-class 和 Web Api "ApiController"-class 合并到一个 "Controller"-class。 ActionResult 方法,这是一个 classic MVC 方法,在构建 MVC 应用程序时很有用,它也包含在合并中,这就是为什么 它在构建 Web Api.
时可用如果您注意到.net core web 的预构建项目api,并非所有功能return ActionResult
或IActionResult
。所以是的,你完全可以 return 像 CustomerDto
这样的东西。通过这种方式,您可以 return 对象 json,状态代码为 200。但是,假设您的操作正在接受一些输入,您并不总是确定是否会有有效输出。在这种情况下,您将希望 return 状态代码仅在成功时为 200,如果用户发送了无效数据或任何其他状态代码则为 400(badRequest)。这是处理http请求的标准方式。
因此,通过使用 IActionResult
,您可以使用 return Json(customer)
或 return Ok(customer)
return 一个 CustomerDto
对象,或者您可以 return 当你 运行 出错时使用 BadRequest(myErrors)
。