使用ASP.NET Core 3.x 构建 RESTful API - 1. 开始

以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本。

预备知识:ASP.NET Core 和 C# 

工具:Visual Studio 2019最新版(VSCodeVS for Mac,Rider等也凑合),POSTMAN 

 

Web API 

Web API通常是指“使用HTTP协议并通过网络调用的API”,由于它使用了HTTP协议,所以需要通过URI信息来指定端点。 

 

API是Application Programming Interface的缩写,是软件的外部接口。也就是说,针对某个软件,人们可以知道它的外部功能,但并不知道(也不需要知道)它的内部运作细节,为了从外部调用某些功能,需要指定软件的调用规范等信息,这样的规范就是API。 

所以Web API就是一个Web系统,通过访问URI可以与其进行信息交互。 

 

大多数的 Web API 并不是 RESTful API 

REST一词是在2000年首次出现的,它是由Roy Fielding博士在《架构风格以及基于网路的软件架构设计》这篇论文中提到的。他为REST风格的API制定了一套约束规范或者叫架构风格 

所以准确的说,只有符合了Roy Fielding架构风格的Web API才能称作是RESTful API。但是在实际开发中,有时候也有不完全符合Roy Fielding架构风格的情形出现,针对这点我将会在稍后的文章中介绍。 

 

MVC模式与RESTful API 

本系列文章中我将使用ASP.NET Core 3.0 MVC 来构建 RESTful API。 

 

MVC(Model-View-Controller)我认为是一种主要用来构建UI的架构模式。对于MVC模式其实有很多种解释存在,但是无论那种解释,它们都会强调松耦合和关注点分离(separation of concerns)。 

也是由于这两点的存在,程序的可测试性会大大提高,程序各部分的可复用性也很高。 

更多关于MVC的介绍,可以看一下微软的官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/overview?view=aspnetcore-3.0 

 

注意:MVC不是一个完整的应用程序架构,我认为它主要是用在展示层。所以实现UI就是MVC的一部分工作。 

 

如何把MVC映射到API

我认为API同样可以看作是UI,它就是为API消费者所提供的UI。 

让我们把MVC的三部分分别对应到API: 

  • Model,它负责处理程序数据的逻辑。这里的Model可以包含在当前级别获取从存储获取数据的逻辑。但是有一些Model不包含任何逻辑,例如API所使用的DTOData transfer objects),这类的Model会被串行化到响应的body里面。 

  • View,它是程序里负责展示数据的那部分。在构建API的时候,View就是数据或资源的展示。现在通常使用JSON格式。 

  • Controller,它负责ViewModel之间的交互。包括处理用户输入,用API的术语来讲,和API交互的“用户”就是指API的消费者,这类用户通常是另一个程序,例如Angular的SPA程序。 

 

下面看看MVC这三部分的依赖关系: 

640?wx_fmt=png

Controller和View依赖于ModelController依赖于View,这也是分离的一个好处。 

换句话说,Controller会选取适当的View来展现给用户,并一同把用户请求的Model数据带回去。 

 

当API消费者发出请求的时候,在Controller上面的Action将会被触发,Controller会把接收到的输入数据发送给负责业务处理逻辑或数据访问逻辑的那部分程序。然后Controller会把Model返回给View,这里的View就是资源的展示(通常是JSON格式)。 

 

接下来我们就是用这套概念和ASP.NET Core 3.0 来创建RESTful API 

但是请注意,通过ASP.NET Core MVC或API模板建立出来的新项目,我们并不会直接得到RESTful(REST架构风格)的API。我们必须在这个基础上,自己构建RESTful的API,因为之前已经提到了,标准的RESTful API有很多约束和规范。 

 

创建ASP.NET Core 3.0 Web API项目 

打开VS2019,选择项目模板ASP.NET Core Web Application 

640?wx_fmt=png

 

然后为项目和解决方案起名字,并选择所在目录: 

640?wx_fmt=png

 

然后选择ASP.NET Core的项目模板: 

640?wx_fmt=png

首先要选择ASP.NET Core 3.0 

这里我选择了API这个模板。在以前,我通常会选择Empty模板,因为其它模板通常包含很多我不需要的东西,但是ASP.NET Core 3.0的API模板还是比较干净的,可以接受。 

最后,由于本课程中不需要使用HTTPSDocker,所以把这两个东西都勾掉。 

 

解剖 ASP.NET Core 3.0 API 模板项目 

点击Create,项目就建立好了: 

640?wx_fmt=png

 

先看看 appsettings.json 

640?wx_fmt=png

里面只有默认的Log配置以及允许的Hosts 

 

appsettings.Development.json里面: 

640?wx_fmt=png

也只有关于Log的默认配置。 

 

注意:您需要知道appsettings.json  appsettings.Development.json之间的关系,关于这点可以看我ASP.NET Core 3.0的入门视频教程,但是更简单的办法是看一下官方文档:在ASP.NET Core中使用多个环境 

 

项目模板里还有两个类我们不需要,所以把它删掉,分别是WeatherForecastControllerWeatherForecast 

640?wx_fmt=png

 

Program.cs 

640?wx_fmt=png

这里其实就是整个程序的入口,Main方法负责配置和运行整个Web程序。 

由于这是一个Web项目,所以我们还需要一个宿主(Host),这个宿主就是由下面的CreateHostBuilder方法来负责创建的。该方法首先会创建出一个实现了IHostBuilder接口的类(HostBuilder)的实例,然后调用它的Build方法来创建宿主(类型为Host,实现了IHost接口),最后调用宿主上面的Run方法来运行程序。 

 

我们暂时不修改这里面的代码,所以一切都会按照项目模板默认的配置进行,注意到下面的方法里我们使用到了Startup这个类: 

640?wx_fmt=png

所以我们来看看Startup类。 

 

Startup.cs 

在这个类的构造函数里: 

640?wx_fmt=png

我们看到IConfiguration被注入了,这样就允许我们使用配置信息了,例如appsettings.json里面的配置信息。 

 

下面有一个ConfigureServices方法: 

640?wx_fmt=png

这个方法负责向服务容器里面注册服务,已注册的服务可以通过依赖注入的方式在整个应用程序的其它地方进行使用。这里的服务是一个比较广义的概念,它就是一个在整个程序中做一些通用性操作的组件。 

 

这里面只有一句话: 

640?wx_fmt=png

3.0之前的版本里,这里面应该写的是services.AddMvc();,实际上在ASP.NET Core 3.0里面这样写也是可以的。但是AddMvc()里面不仅仅包含用于构建API的服务,还包含很多其它服务,例如构建View视图和TagHelper相关的服务等。而AddControllers()方法只包含用于构建API的那些服务,例如Controller的支持、Model绑定、Data Annotation和格式化器等等。 

 

最下面还有一个Configure方法: 

640?wx_fmt=png

这个方法使用到了在ConfigureServices方法里面注册和配置的服务,所以这个方法是在ConfigureServices方法之后被调用的。 

Configure方法是用来指定ASP.NET Core Web程序是如何响应每一个HTTP请求的。换句话说,也就是我们在这里配置请求的管道,配置的方法就是在这里添加很多中间件(Configure方法里面每一个app.UseXxx就是添加一个中间件,可以查看中间件的官方文档来了解更多)。 

 

在开发环境的时候,如果有异常发生,那么会展示出一个异常页面: 

640?wx_fmt=png

 

app.UseAuthorization(),它会为整个Web程序添加授权的能力。当你需要考虑API安全性的时候,这点就很重要了。通常授权配置是在ConfigureServices方法里完成的,而我现在没有对授权进行配置,但是app.UseAuthorization()仍然会允许API可以被匿名的访问。 

 

其它这几句话: 

640?wx_fmt=png

这几句话都是用来指定如何把HTTP请求分配到特定的Controller Action上面的。也就是说这是关于路由的。 

 

很重要的一点就是:每一个请求会按照代码的顺序穿越所有在这里添加的中间件。但是每一个中间件都有可能将请求短路,这样的话请求就不会进入下一个中间件了,而会按照原路返回。 

640?wx_fmt=png

所以,添加中间件的顺序非常重要。如果你把授权中间件放在了Controller的后边,那么即使需要授权,那么请求也会先到达Controller并执行里面的代码,这样的话授权就没有意义了。 

 

修改项目启动配置 

我喜欢使用控制台启动Web程序,这样可以很直观的看到Log信息。为达到这个目的,可以修改launchSettings.json文件: 

640?wx_fmt=png

 

修改后,在项目的Debug属性里也有体现: 

640?wx_fmt=png

由于我主要是使用POSTMAN来调用API,所以我不需要Launch Browser(启动浏览器)。 

 

运行程序 

640?wx_fmt=png

可以看到程序可以正常运行,并且在控制台上有日志的输出。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core 3.1 编写混合 C++ 程序

前言随着 .NET Core 3.1 的第二个预览版本发布,微软正式将 C/CLI 移植到 .NET Core 上,从此可以使用 C 编写 .NET Core 的程序了。由于目前仅有 MSVC 支持编译此类混合代码,并且由于涉及到非托管代码,因此 C/CLI 目前不能跨平台&a…

在ASP.NET Core中编写合格的中间件

这篇文章探讨了让不同的请求去使用不同的中间件,那么我们应该如何配置ASP.NET Core中间件?其实中间件只是在ASP.NET Core中处理Web请求的管道。所有ASP.NET Core应用程序至少需要一个中间件来响应请求,并且您的应用程序实际上只是中间件的集合…

全网首发 PowerBI 秒级实时大屏通用解决方案

双十一来了,你准备好了吗?不管你是否准备完毕,我们带来了全网首发的 PowerBI 秒级实时大屏展示方案,你可以直接用来展示双十一的实时状况。我们一步步来说明这个套件模板教程。真实效果功能如下:全实时展示 双十一 当天…

普大喜奔 | Azure 免费送网站SSL证书啦!

点击上方蓝字关注“汪宇杰博客”导语就在今晨,微软推出了 App Service Managed Certificates 预览版。简单来说,这就是在 Azure App Service 服务的一项更新,免费送你SSL证书!只要点几下鼠标就能给网站加上SSL证书!并且…

VS Code 1.40 发布!可自行搭建 Web 版 VS Code!

今天(北京时间 2019 年 11 月 8 日),微软发布了 Visual Studio Code 1.40 版本。让我们来看看有哪些主要的更新。自建 Web 版 VS Code 如果你已经下载了 VS Code 在 GitHub 上的源代码,只需运行 yarn web,就能在 http:…

超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本

超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本前言上一篇自动化测试,全面且详细的介绍了从零开始到发布版本的步骤,这是传统的方式,本次为大家带来的是如何在5分钟内使用上docker进行CI/CD,毕竟现在的容器化如火如荼&am…

.NET Core 又一杀器! Web Blazor框架横空出世!

多年来,Javascript(及其子框架)已在浏览器中运行DOM(文档对象模型),并且掌握了脚本知识才能真正操作客户端UI。大约2年前,所有这些都随着Web Assembly的引入而发生了变化-Web Assembly允许在客户…

.NET Conf 2019 今天在上海开幕,图片直播地址

.NET Conf 2019 在上海开幕,全程提供图片直播:https://vzan.com/live/tvchat-1099246581下午的分会场内容如下:上午有个直播 ,请阅读原文访问https://vzan.com/live/tvchat-1099246581 。

Asp.Net Core 单元测试正确姿势

背景ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,并且默认注入了很多服务,具体可以参考 官方文档, 相信只要使用过依赖注入框架的同学,都会对此有不同深入的理解,在此无需赘言。然而,在引入 IOC 框架之后&#x…

程序员与「中台」的爱恨交错

大家好,我是Z哥。这篇文章比较长,有5200字,不过希望你能耐心看完,特别是程序员。中台这个词,最近两年特别火,它的爆发源于2015年张勇在阿里发出的内部信中提到的“大中台,小前台”战略。随后吸引…

ML.NET 1.4 发布,跨平台机器学习框架

ML.NET 是一个面向 .NET 开发人员的开源和跨平台机器学习框架,它包括 Model Builder 和 CLI(命令行接口),让使用自动机器学习(AutoML)构建自定义机器学习模型变得更容易。1.4 版本已经发布了,以下是本次更新的一些亮点:基于 GPU 支…

使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API

1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作什么是REST REST一词最早是在2000年,由Roy Fielding在他的博士论文《Architectural Styles and the Design of Network-based Software Architecture》中提出的。他在本文中创造了REST这个术语。这篇论文的地…

Visual Studio Online 的 FAQ:iPad 支持、自托管环境、Azure 账号等

iPad 支持 目前,Web 版 VS Code 只支持基于 Chromium 的浏览器,还不支持 iPad 上的浏览器。但对于 Safari 的支持,是 Visual Studio Online 团队的一件高优先级的任务。更多详情,可以关注: https://github.com/Microso…

2019 .NET China Conf之我逛魔都

趁着参加首届.NET开发者峰会之际,我也是第一次到上海,因此也趁机逛了一下大魔都,和你分享一波我在魔都拍的照片组。酒店所在地:邮电新村地铁站附近为何选择这里?因为离会场酒店6个地铁站,离南京东路和外滩半…

参加首届中国 .NET 开发者峰会有感

参加首届中国 .NET 开发者峰会有感Intro很高兴能够有机会参加首届中国 .NET 开发者峰会,与从全国各地赶来上海参加活动的 .NETer 一起参与这空前的 .NET 的盛会。大会有许多从外地过来参加的开发者们,也有些讲师也是从外地赶过来为我们分享,特…

推荐一款神器-VBAC#代码编辑管理器

网名:liucqa,OFFICE开发领域真大牛,比ExcelHome所有版主和所有出OFFICE开发类书籍的人都要牛的人,出品了它的大作,给大家推荐使用。特色功能:C#&VBA代码格式化/代码收藏/高亮语法详细介绍说明如下&…

【.NET Core 3.0】 46 ║ 授权认证:自定义返回格式

前言哈喽大家好,马上就要年末了,距离新的一年,只有50天了,春节是75天。在这个时节内,天气逐渐变凉,但是大家的心肯定很热吧,因为发生了两件大事:1、双十一买买买,在这个让…

.NET Core 如何生成真正的ICO图标

点击上方蓝字关注“汪宇杰博客”导语前一阵我终于完成了博客系统动态生成favicon的功能。众所周知,favicon肯定有一个ico格式的图标,其余可以用 png manifest 的方式输出。然而这个ICO格式让我小收福报,今天就给大家分享一下解决办法。.NET自…

Visual Studio Online 东半球首秀,亮相 .NET Conf 2019 中国峰会

佷高兴能参加 .NET Conf 并演讲。看到 NET 社区这么活跃,也是非常开心!这次我演讲的主题是《Visual Studio Code —— .NET 开发利器》。找找我在哪?更多关于 Visual Studio Online 的四种开发模式,可以阅读这篇文章:最…

.NET Core 3.0 部署在docker上运行

自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0。本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docker上运行。需要你本地有docker环境1.创建一个站点创建一个ASP.NET Core Web应用…