响应的最基本的版本JsonResult
是:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
但是,这将无法解决您的问题,因为您无法明确处理自己的响应代码。
控制状态结果的方法是,您需要返回a 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文档的出色指南:格式化响应数据
额外的东西
我经常遇到的问题是,我希望对我的WebAPI进行更精细的控制,而不是仅仅使用VS中“新项目”模板中的默认配置。
让我们确保您掌握了一些基础知识...
步骤1:配置服务
为了使您的ASP.NET Core WebAPI在状态代码的完全控制下以JSON序列化对象作为响应,您应该首先确保已将AddMvc()
服务包含在ConfigureServices
通常在中找到的方法中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()
从GitHub存储库中签出。。
请注意,有一些指南将尝试通过“撤消”默认值来解决此问题,而不是仅仅不首先实现它。如果您考虑到我们现在正在使用开放源代码,那么这是多余的工作,错误的代码以及坦率的旧习惯,这种习惯很快就会消失。
步骤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
如我先前推荐的文章(格式化响应数据)中所示,您可以在Controller / Action级别强制使用特定格式。我个人不喜欢这种方法...但是这里是为了完整性:
强制使用特定格式如果您想限制特定操作的响应格式,则可以应用[Produces]过滤器。[生产]过滤器指定特定操作(或控制器)的响应格式。像大多数过滤器一样,可以将其应用于操作,控制器或全局范围。
[Produces("application/json")]
public class AuthorsController
该[Produces]
过滤器将迫使内的所有动作
AuthorsController
返回JSON格式的响应,即使其他格式化被配置为应用程序和客户端提供了一个Accept
头,要求不同,可用的格式。
方法2
我的首选方法是WebAPI以请求的格式响应所有请求。但是,如果它不接受请求的格式,则回退到默认格式(即JSON)
首先,您需要在选项中进行注册(如前所述,我们需要重做默认行为)
options.RespectBrowserAcceptHeader = true; // false by default
最后,通过简单地重新排序在服务构建器中定义的格式器的列表,Web主机将默认使用您位于列表顶部(即位置0)的格式器。
有关更多信息,请参见此.NET Web开发和工具博客条目。
CreatedAtRoute
方法等