我正在寻找在我的.NET Core Web API 控制器中使用 HTTP 状态代码返回 JSON 的正确方法。我用它像这样:
public IHttpActionResult GetResourceData()
{
return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}
这是在一个 4.6 MVC 应用程序,但现在有.NET 核心我似乎没有这个IHttpActionResult
我有ActionResult
并使用这样:
public ActionResult IsAuthenticated()
{
return Ok(Json("123"));
}
但是来自服务器的响应很奇怪,如下图所示:
我只是希望 Web API 控制器返回带有 HTTP 状态代码的 JSON,就像我在 Web API 2 中所做的那样。
9 回答
使用
JsonResult
响应的最基本版本是:但是,这不会对您的问题有所帮助,因为您无法明确处理自己的响应代码。
例如:
请注意,上述两个示例都来自 Microsoft 文档中提供的精彩指南:格式化响应数据
额外的东西
我经常遇到的问题是我希望对我的 WebAPI 进行更细粒度的控制,而不是仅使用 VS 中“新建项目”模板的默认配置。
让我们确保你有一些基础知识......
第 1 步:配置您的服务
为了让您的 ASP.NET Core WebAPI 能够在完全控制状态代码的情况下使用 JSON 序列化对象进行响应,您应该首先确保在
Startup.cs
中通常找到的ConfigureServices
方法中包含AddMvc()
服务。如果您的项目需要完全控制并且您想要严格定义您的服务,例如您的 WebAPI 将如何处理各种请求类型(包括
application/json
)而不响应其他请求类型(例如标准浏览器请求),您可以使用以下代码手动定义它:你会注意到我还提供了一种方法来添加你自己的自定义 Input/Output 格式化程序,如果你想要响应另一种序列化格式(protobuf,thrift 等)。
上面的代码块大部分是
AddMvc()
方法的副本。但是,我们通过定义每个服务而不是使用带有模板的 pre-shipped 来实现每个“默认”服务。我在代码块中添加了存储库链接,或者您可以查看AddMvc()
来自 GitHub 存储库。。请注意,有一些指南会试图通过“撤消”默认值来解决这个问题,而不是仅仅是首先实现它...如果你考虑到我们现在正在使用开源,这是多余的工作,糟糕的代码和坦率的旧习惯很快就会消失。
第 2 步:创建一个控制器
我要给你一个真正的 straight-forward 只是为了让你的问题排序。
第 3 步:检查 Content-Type 并接受
您需要确保请求中的
Content-Type
和Accept
标头设置正确。在您的情况下(JSON),您需要将其设置为application/json
。如果您希望 WebAPI 作为默认值以 JSON 响应,则无论请求标头指定了什么,您都可以以的方式执行此操作。
方式 1如我之前建议的文章(格式化响应数据)所示,您可以在 Controller/Action 级别强制使用特定格式。我个人不喜欢这种方法......但这里是为了完整性:
即使为应用程序配置了其他格式化程序,并且客户端提供了一个请求不同可用格式的
Accept
标头,[Produces]
过滤器也会强制AuthorsController
中的所有操作返回 JSON-formatted 响应。方式 2我首选的方法是让 WebAPI 以所请求的格式响应所有请求。但是,如果它不接受请求的格式,则fall-back为默认值(即 JSON)
首先,您需要在您的选项中注册(我们需要重做默认行为,如前所述)
最后,通过简单地 re-ordering 在服务构建器中定义的格式化程序列表,Web 主机将默认为位于列表顶部的格式化程序(即位置 0)。
更多信息可在此.NET Web 开发和工具博客条目找到
您有最常见状态代码的预定义方法。
Ok(result)
返回带响应的200
CreatedAtRoute
返回201
新资源 URLNotFound
返回404
BadRequest
返回400
等有关所有方法的列表,请参见BaseController.cs和Controller.cs。
但是如果你真的坚持你可以使用
StatusCode
来设置自定义代码,但你真的不应该因为它使代码的可读性降低而且你必须重复代码来设置标题(比如CreatedAtRoute
)。使用ASP.NET Core 2.0,从
Web API
返回对象的理想方式(与 MVC 统一并使用相同的基类Controller
)是请注意
它返回
200 OK
状态代码(它是ObjectResult
类型的ObjectResult
)它进行内容协商,i.e。它将根据请求中的
Accept
标头返回。如果在请求中发送Accept: application/xml
,它将返回XML
。如果没有发送任何内容,JSON
是默认值。如果需要发送带有特定状态代码的,请改用
ObjectResult
或StatusCode
。两者都做同样的事情,并支持内容协商。如果你特别想以 JSON的形式返回,有几种方法
请注意
两者都以两种不同的方式强制执行
JSON
。两者都忽略了内容协商。
第一种方法使用特定的序列化程序
Json(object)
强制执行 JSON。第二种方法使用
contentType = application/json
属性(即ResultFilter
)与contentType = application/json
相同在官方文件中阅读有关它们的更多信息。了解过滤器。
样本中使用的简单模型类
我想出的最简单的方法是:
这是我最简单的解决方案:
要么
而不是使用枚举使用 404/201 状态代码
我在 Asp Net Core Api 应用程序中所做的是创建一个从 ObjectResult 扩展的类,并提供许多构造函数来自定义内容和状态代码。然后我的所有控制器动作都使用其中一个协调器作为适当的。您可以在以下位置查看我的实现:https://github.com/melardev/AspNetCoreApiPaginatedCrud
和
https://github.com/melardev/ApiAspCoreEcommerce
这里是类看起来 like(go 到我的 repo 的完整代码):
注意 base(dto)你用你的对象替换 dto,你应该好好去。
我在这里找到了很棒的答案,我也尝试了这个返回语句,看
StatusCode(whatever code you wish)
,它有效!!!请参考下面的代码,您可以使用不同类型的 JSON 管理多个状态代码