以JsonResult 响应的最基本版本是:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
但是,这对您的问题没有帮助,因为您无法明确处理自己的响应代码。
控制状态结果的方法是,您需要返回一个ActionResult,然后您可以在其中利用StatusCodeResult 类型。
例如:
// GET: api/authors/search?namelike=foo
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
var result = _authorRepository.GetByNameSubstring(namelike);
if (!result.Any())
{
return NotFound(namelike);
}
return Ok(result);
}
请注意,以上两个示例均来自 Microsoft 文档中的一个很棒的指南:Formatting Response Data
额外的东西
我经常遇到的问题是,我希望对我的 WebAPI 进行更精细的控制,而不是仅仅使用 VS 中“新项目”模板中的默认配置。
让我们确保您掌握了一些基础知识...
第 1 步:配置您的服务
为了让您的 ASP.NET Core WebAPI 响应 JSON 序列化对象以及对状态代码的完全控制,您应该首先确保在您的 ConfigureServices 方法中包含 AddMvc() 服务通常在Startup.cs中找到。
请务必注意,AddMvc() 将自动包含 JSON 的输入/输出格式化程序以及响应其他请求类型。
如果您的项目需要完全控制并且您希望严格定义您的服务,例如您的 WebAPI 将如何处理各种请求类型,包括application/json,而不响应其他请求类型(例如一个标准的浏览器请求),您可以使用以下代码手动定义它:
public void ConfigureServices(IServiceCollection services)
{
// Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore().
// https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs
services
.AddMvcCore(options =>
{
options.RequireHttpsPermanent = true; // does not affect api requests
options.RespectBrowserAcceptHeader = true; // false by default
//options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
//remove these two below, but added so you know where to place them...
options.OutputFormatters.Add(new YourCustomOutputFormatter());
options.InputFormatters.Add(new YourCustomInputFormatter());
})
//.AddApiExplorer()
//.AddAuthorization()
.AddFormatterMappings()
//.AddCacheTagHelper()
//.AddDataAnnotations()
//.AddCors()
.AddJsonFormatters(); // JSON, or you can build your own custom one (above)
}
您会注意到,我还提供了一种方法供您添加自己的自定义输入/输出格式化程序,以备您可能想要响应另一种序列化格式(protobuf、thrift 等)时使用。
上面的代码块大部分是 AddMvc() 方法的副本。但是,我们通过定义每个服务而不是使用带有模板的预发布服务来自行实现每个“默认”服务。我已经在代码块中添加了仓库链接,或者你可以查看AddMvc()from the GitHub repository.。
请注意,有一些指南会尝试通过“撤消”默认设置来解决这个问题,而不是一开始就不实施它...如果您考虑到这一点,我们现在正在使用 Open来源,这是多余的工作,糟糕的代码,坦率地说,这是一个很快就会消失的旧习惯。
第 2 步:创建控制器
我将向您展示一个非常直截了当的问题,只是为了解决您的问题。
public class FooController
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] Object item)
{
if (item == null) return BadRequest();
var newItem = new Object(); // create the object to return
if (newItem != null) return Ok(newItem);
else return NotFound();
}
}
第 3 步:检查您的 Content-Type 和 Accept
您需要确保您的 请求 中的 Content-Type 和 Accept 标头设置正确。在您的情况下(JSON),您需要将其设置为 application/json。
如果您希望 WebAPI 默认以 JSON 响应,无论请求标头指定什么,您都可以通过几种方式来实现。
方式 1
如我之前推荐的文章 (Formatting Response Data) 所示,您可以在 Controller/Action 级别强制使用特定格式。我个人不喜欢这种方法......但这里是为了完整性:
强制使用特定格式如果您想限制特定操作的响应格式,您可以应用
[产生]过滤器。 [Produces] 过滤器指定响应
特定动作(或控制器)的格式。像大多数过滤器一样,这个
可以在动作、控制器或全局范围内应用。
[Produces("application/json")]
public class AuthorsController
[Produces] 过滤器将强制在
AuthorsController 返回 JSON 格式的响应,即使其他
为应用程序和提供的客户端配置了格式化程序
Accept 标头请求不同的可用格式。
方式 2
我的首选方法是让 WebAPI 以请求的格式响应所有请求。但是,如果它不接受请求的格式,则回退到默认(即 JSON)
首先,您需要在选项中注册它(我们需要修改默认行为,如前所述)
options.RespectBrowserAcceptHeader = true; // false by default
最后,通过简单地重新排序服务构建器中定义的格式化程序列表,网络主机将默认使用您位于列表顶部的格式化程序(即位置 0)。
更多信息可以在这个.NET Web Development and Tools Blog entry找到