在本片文章中,我们会从0开始,构建一个简单的api后端程序
api,中文全称为应用程序编程接口,本篇中代指web api,也就是在网络上暴露给用户的请求接口。使用方可以通过发送网络请求的方式使用我提供的功能,比如增删查改等等。
相比包含razor的mvc系统,api项目结构更加简单,更有利于新手全面了解asp的结构。并且如果一个项目采用spa前端(通常比普通的razor page用户体验更好),那么后端只需要api就行了。
那么废话少说,我们开始吧。
首先,用visual studio的同学,请打开vs,新建项目,选择asp.net core程序注意一定选带core的,不带core的是另一个东西!!
选择后,点击下一步,然后取名为MyFirstApi
接着,点击下一步,选择api项目模板,不要添加身份认证!!
点击创建,完成项目的创建。
此时你的项目结构应该像这样:
创建完毕后,我们废话不多说,直接运行它试试。点击上方的debug按钮开始运行
注:按钮里的iis express是visual studio自带的开发用服务器的名字,这个服务器实际上是iis的阉割版。
开始运行之后,vs会自动打开一个浏览器窗口,接着你可以在窗口上看到你的服务器返回的数据
只要看到数据,就代表运行成功了
上一节中,我们通过浏览器请求到了我们后端服务器上的数据,那么它是怎么做到的呢?
首先,我们打开controller文件夹下的WeatherForecastController.cs文件,在它的第30行加个断点,重新运行程序,不久你就会发现在网页加载过程中,vs命中了这个断点。
而当你点击继续执行之后,网页中的数据立刻显示了出来。
很容易看出,网页请求这个url的时候,后端实际上用这个Get方法处理了数据,并且返回。那么为什么这个url会触发这个函数进行处理,而不是其它函数呢?
让我们看看WeatherForecastController类的上方,有一个RouteAttribute,他里边写了个
[controller]。这种写法是一种约定写法,等效于写controller类的名字,也就是说,实际上[Route("[controller]")]等效于[Route("WeatherForecast")]。它的作用和它得得名字一样:标识controller对应的url路径。这里的意思也就是说这个controller类对应的url路径为/WeatherForecast,所有路径以这个开头的url都会被定向到这个类来处理。
但是,类本身是无法处理请求的,实际上最终处理请求的是类里的函数。那么我们怎么确定用哪个函数来处理请求呢?
可以看到,刚刚我们发现处理请求的函数Get,上边有个HttpGetAttribute实际上,这个attribute里也是可以加构造参数的,而构造参数是一个字符串,这个字符串对应controller下的子路径,我们项目中的不带参数的写法
[HttpGet]等效于[HttpGet("")],也就是说这个方法用来处理"/WeatherForecast"路径下的""路径的请求,最终也就是请求"/WeatherForecast",所以我们浏览器对该路径的请求最后交给了Get`方法处理。
那么,理解了原理,我们就可以自己改变代码,看看改变的结果了。
比如现在不想让它返回天气信息,我想让它直接返回controller中的Summaries数组,那么我们可以把WeatherForecastController类替换为下方的类:
[ApiController]
[Route("WeatherForecast")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet("summaries")]
public IEnumerable<string> Get()
{
return Summaries;
}
}
然后,我们运行后,把路径改为/weatherforecast/summaries进行请求,就可以看到后端返回了Summaries的信息。
WeatherForecastController,添加更多的函数,处理不同路径的请求[HttpGet]attribute,细心的同学会发现还有[HttpPost]等其它attribute,它们实际上对应不同的请求方式。请上网查找http请求的不同方式的区别,为下一次课做准备。本文章使用limfx的vsocde插件快速发布