欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何从ASP.NET Core Web API返回数据

程序员文章站 2022-03-10 22:49:14
...

我们有三种方法可以从ASP.NET Core中的操作方法返回数据和HTTP状态代码。 您可以返回特定类型,返回IActionResult类型的实例,或者返回ActionResult类型的实例。

尽管返回特定类型是最简单的方法,但IActionResult允许您同时返回数据和HTTP代码,而ActionResult <T>则允许您返回扩展IActionResult的类型。 ActionResult可用于从操作方法发送HTTP状态代码,数据或两者。

[ 也在InfoWorld上:微软开发人员工具和技术将在2020年进行探索 ]

本文讨论了如何使用每种类型的ASP.NET Core Web API返回数据,以及C#中的相关代码示例。

若要使用本文中说明的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019

创建一个ASP.Net Core API项目

首先,让我们在Visual Studio中创建一个ASP.NET Core项目。 假设系统中已安装Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.NET Core项目。

  1. 启动Visual Studio IDE。
  2. 点击“创建新项目”。
  3. 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.Net Core Web应用程序”。
  4. 点击下一步。
  5. 在“配置新项目”窗口中,指定新项目的名称和位置。
  6. 单击创建。
  7. 在接下来显示的“创建新的ASP.Net Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 2.2(或更高版本)。 我将在这里使用ASP.NET Core 3.0。
  8. 选择“ API”作为项目模板以创建新的ASP.NET Core API应用程序。
  9. 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
  10. 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
  11. 单击创建。

这将在Visual Studio中创建一个新的ASP.NET Core API项目。 现在,在“解决方案资源管理器”窗口中选择Controllers解决方案文件夹,然后单击“添加-> Controller…”以创建一个名为DefaultController的新控制器。 在本文的后续部分中,我们将使用该项目来探索从操作方法返回的数据。

如果您想要一种简单的方法来测试我们下面使用的操作方法,我建议您利用Postman。 您可以从此处下载Postman的副本

[ 同样在InfoWorld上:如何在ASP.NET Web API中记录请求和响应元数据 ]

在ASP.NET Core中创建Controller和Model类

创建一个新的解决方案文件夹并将其命名为Models。 您将在这里放置模型类。 以下代码清单说明了如何创建名为Author的简单模型类。

public class Author
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

到目前为止,一切都很好。 现在,用下面给出的代码列表替换DefaultController类的生成代码。

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace IDGCoreWebAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class DefaultController : ControllerBase
    {
        private readonly List<Author> authors = new List<Author>();
        public DefaultController()
        {
            authors.Add(new Author()
            {
                Id = 1,
                FirstName = "Joydip",
                LastName = "Kanjilal"
            });
            authors.Add(new Author()
            {
                Id = 2,
                FirstName = "Steve",
                LastName = "Smith"
            });
        }
        [HttpGet]
        public IEnumerable<Author> Get()
        {
            return authors;
        }
        [HttpGet("{id}", Name = "Get")]
        public Author Get(int id)
        {
            return authors.Find(x => x.Id == id);
        }
    }
}

[ 同样在InfoWorld上:什么是CI / CD? 持续集成和持续交付的解释 ]

从ASP.NET Core中的操作方法返回特定类型

从操作方法返回数据的最简单方法是返回特定类型。 在上面显示的代码清单中,Get操作方法返回Author实例的列表。 这些实例是在DefaultController类的构造函数中创建和初始化的。 下面再次是操作方法,供您参考。 请注意,它返回IEnumerable <Author>。

[HttpGet]
public IEnumerable<Author> Get()
{
   return authors;
}

从ASP.NET Core 3.0开始,您还可以选择从操作方法返回IAsyncEnumerable <T>。 IEnumerable <T>执行同步集合迭代,而IAsyncEnumerable <T>执行异步迭代。 由于没有阻塞调用,因此IAsyncEnumerable <T>效率更高。 (我将在以后的文章中进一步讨论IAsyncEnumerable。)

这是使用IAsyncEnumerable重新编写前面的操作方法的方法。

[HttpGet]
public async IAsyncEnumerable<Author> Get()
{
   var authors = await GetAuthors();
   await foreach (var author in authors)
   {
        yield return author;
   }
}

从ASP.NET Core中的操作方法返回IActionResult类型的实例

当您想从操作方法中返回数据和HTTP代码时,可以利用IActionResult接口。 以下代码段说明了如何实现此目的。

[HttpGet]
public IActionResult Get()
{
  if (authors == null)
      return NotFound("No records");
  return Ok(authors);
}

IActionResult接口由OkResult,NotFoundResult,CreatedResult,NoContentResult,BadRequestResult,UnauthorizedResult和UnsupportedMediaTypeResult类实现。

在前面的代码片段中,方法NotFound()和Ok()返回IActionResult类型的实例。

[ 通过InfoWorld的App Dev Report新闻通讯了解软件开发中的热门话题 ]

从ASP.NET Core中的操作方法返回类型为ActionResult <T>的实例

ASP.NET Core 2.1中引入了ActionResult <T>。 ActionResult是一种实现IActionResult接口的类型。 您可以利用ActionResult <T>返回类型来返回扩展ActionResult的类型或任何其他特定类型(例如本例中的Author)。

以下代码段说明了如何从操作方法返回ActionResult <T>。

[HttpGet]
public ActionResult<IEnumerable<Author>> Get()
{
  if (authors == null)
       return NotFound("No records");
   return authors;
}

正如您在前面的代码片段中看到的那样,您不再需要将要返回的对象包装在Ok()方法中—您可以按原样返回它。

现在让我们使其异步。 考虑以下异步方法,该方法返回作者列表。

private async Task<List<Author>> GetAuthors()
{
    await Task.Delay(100).ConfigureAwait(false);
    return authors;
}

异步方法应至少包含一个await语句。 如果没有任何await语句,则编译器将生成一条警告,指出该方法将同步运行。 为了避免出现此编译器警告,我等待了前面代码片段中对Task.Delay方法的调用。

下面列出了更新的操作方法。 请注意,如何使用await关键字来调用我们刚刚创建的async方法。

[HttpGet]
public async Task<ActionResult<IEnumerable<Author>>> Get()
{
   var data = await GetAuthors();
   if (data == null)
        return NotFound("No record");
   return data;
}

[ 也在InfoWorld上:用于AI开发的6种最佳编程语言 ]

您还可以从操作方法返回自定义ActionResult的实例。 您需要做的就是创建一个实现IActionResult接口并实现ExecuteResultAsync方法的类。 我们将在以后的文章中讨论IActionResult和ActionResult以及自定义ActionResult类。

From: https://www.infoworld.com/article/3520770/how-to-return-data-from-aspnet-core-web-api.html