响应最基本版本的JsonResult
是:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
然而,这并不能解决您的问题,因为您无法显式地处理自己的响应代码。
要控制状态结果,您需要返回一个ActionResult
,而这正是您可以利用StatusCodeResult
类型的地方。
例如:
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
var result = _authorRepository.GetByNameSubstring(namelike);
if (!result.Any())
{
return NotFound(namelike);
}
return Ok(result);
}
请注意,上述示例均来自Microsoft文档中提供的一份很好的指南:格式化响应数据
额外内容
我经常遇到的问题是,我希望对我的WebAPI进行更细粒度的控制,而不仅仅使用VS中“新项目”模板中的默认配置。
让我们确保您已经掌握了一些基础知识......
第1步:配置服务
为了让ASP.NET Core WebAPI响应一个JSON序列化对象以及完全控制状态码,您应该首先确保在ConfigureServices
方法中包含了AddMvc()
服务,通常可以在Startup.cs
中找到。
需要注意的是,AddMvc()
会自动包含用于JSON的输入/输出格式化程序,并响应其他请求类型。
如果您的项目需要完全控制,并且要严格定义您的服务,例如如何处理各种请求类型(包括application/json
),并且不响应其他请求类型(例如标准浏览器请求),则可以使用以下代码手动定义:
public void ConfigureServices(IServiceCollection services)
{
services
.AddMvcCore(options =>
{
options.RequireHttpsPermanent = true;
options.RespectBrowserAcceptHeader = true;
options.OutputFormatters.Add(new YourCustomOutputFormatter());
options.InputFormatters.Add(new YourCustomInputFormatter());
})
.AddFormatterMappings()
.AddJsonFormatters();
}
你会注意到,我还提供了一种方法让你添加自定义的输入/输出格式化器,以便你可以响应其他序列化格式(protobuf、thrift等)。
上面那段代码大部分是 AddMvc()
方法的副本。然而,我们通过定义每个服务来实现每个“默认”服务,而不是使用模板中预装的服务。我已经在代码块中添加了存储库链接,或者你可以从GitHub存储库中查看AddMvc()
。
请注意,有些指南会尝试通过“撤消”默认设置来解决此问题,而不是一开始就不实现它... 如果考虑到现在我们正在使用开源软件,这是重复性劳动、糟糕的代码,并且老习惯很快就会消失。
步骤2:创建控制器
我将向您展示一个非常简单直观的控制器,只是为了让您的问题得到解决。
public class FooController
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] Object item)
{
if (item == null) return BadRequest();
var newItem = new Object();
if (newItem != null) return Ok(newItem);
else return NotFound();
}
}
步骤3:检查你的Content-Type
和Accept
确保在请求中设置了正确的Content-Type
和Accept
头部。对于你的情况(JSON),你需要将其设置为application/json
。
如果你想让你的 WebAPI 以 JSON 格式作为默认响应,不管请求头部指定的格式是什么,你可以用两种方式实现。
方式1
正如我之前推荐的文章所示(格式化响应数据),你可以在 Controller/Action 级别上强制使用特定格式。个人而言,我不喜欢这种方法... 但出于完整性考虑,这里还是介绍一下:
强制使用特定格式 如果你想限制特定操作的响应格式,可以应用 [Produces] 过滤器。[Produces] 过滤器指定了特定操作(或控制器)的响应格式。像大多数过滤器一样,它可以应用于操作、控制器或全局范围。
[Produces("application/json")]
public class AuthorsController
[Produces]
过滤器将强制
AuthorsController
中的所有操作返回 JSON 格式的响应,即使为应用程序和客户端配置了其他格式化程序且客户端提供了请求不同可用格式的
Accept
标头。第二种方法是WebAPI以所请求的格式响应所有请求。但是,如果它不接受请求的格式,则回退到默认格式(即JSON)。首先,您需要在选项中注册它(我们需要重新设计默认行为,如前所述)。
options.RespectBrowserAcceptHeader = true
通过简单地重新排列在服务生成器中定义的格式化程序列表,Web主机将默认使用您在列表顶部(即位置0)放置的格式化程序。
有关更多信息,请参阅.NET Web开发和工具博客文章