我正在使用.NET Core开发ASP.NET Web API。这个Web API将主要由UI应用程序访问(UI将使用ASP.NET Core MVC开发),但未来API也可以被其他应用程序访问。
在我的WEB API中,所有方法都是异步的。
如果我希望客户进行内容协商,那么应该是API操作方法的返回类型Task<IActionresult>
或Task<SomePOCO>
如果我希望方法始终以JSON格式返回数据,那么API操作方法的返回类型应该是什么?它应该是Task<IActionResult>
还是Task<JsonResult>
还是Task<SomePOCO>
,因为我认为所有3个都可行,所以不确定哪一个适合这里?
答案 0 :(得分:10)
如果我希望[客户]进行内容协商,那么API操作方法的返回类型应该是什么?
要进行内容协商,请返回Task<ObjectResult>
或Task<MyPoco>
。
框架自动将POCO包装在ObjectResult
中;因此,两个选项都是等效的,并且都将遵循HTTP Accept
标头。您还可以通过返回实现ObjectResult
的任何结果来获得内容协商,例如OkObjectResult
。
如果我希望[the]方法始终以JSON 格式返回数据,那么API动作方法的返回类型应该是什么?
要始终返回JSON,请返回Task<JsonResult>
(或使用[Produces]
过滤器)。
另请参阅:https://docs.asp.net/en/latest/mvc/models/formatting.html#content-negotiation
[S] o我假设
IActionResult
仅用于MVC控制器?
IActionResult
是Controller
返回的所有结果的合同。如果您的操作的签名具有IActionResult
返回类型,那么您的操作方法正文可以return
任何结果类型,因为它们都实现了IActionResult
接口。这是继承层次结构。
IActionResult
ActionResult
ChallengeResult
ContentResult
EmptyResult
FileResult
FileContentResult
FileStreamResult
PhysicalFileResult
VirtualFileResult
ForbidResult
LocalRedirectResult
ObjectResult
CreatedAtActionResult
CreatedAtRouteResult
CreatedResult
BadRequestObjectResult
NotFoundObjectResult
OkObjectResult
RedirectResult
RedirectToActionResult
RedirectToRouteResult
SignInResult
SignOutResult
StatusCodeResult
NoContentResult
NotFoundResult
OkResult
UnauthorizedResult
UnsupportedMediaTypeResult
BadRequestResult
另请参阅:https://github.com/aspnet/Mvc/tree/dev/src/Microsoft.AspNetCore.Mvc.Core
答案 1 :(得分:3)
看看招摇: https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger 最好为方法指定ProducesResponseType属性:
[ProducesResponseType(typeof(TodoItem), 201)]
public IActionResult Create([FromBody, Required] TodoItem item)
这样自动生成的swagger文档就可以显示该方法的实际返回数据。