运行环境
下载地址:https://dotnet.microsoft.com/download
下载64位的。
runtime是做什么用的呢?IIS这里有个模块。
有了这个AspNetCoreModuleV2 。dotnet core3 才能在iis上运行。
hosting是iis上需要安装的
后续的部署会在手写朝夕官网的时候会做部署。
创建项目
给项目起个名字WebApiDemo
右侧的Https可选也可以不选。反正最终是部署到iis上的
启动webapi的几种方式
直接点击iis express 启动。
webApi指定启动路由的地址在哪里指定?
命令启动,找到程序的目录,然后输入cmd
bin/debug/netcoreapp3.1
我们要启动的是WebApiDemo.dll
—urls 指定启动的地址
指定ip: —ip 然后 —port指定端口号
显示三个绿色的info。说明程序已经执行ok了。
输入127.0.0.1:2020 输入地址啥也没打开。我们的webAPi和和MVC项目有个重大的区别。webapi虽然有指定的根目录,但是指定的根目录不好省略,所以我们必须要把根目录写上去。
我们首先要展示的是这个controller
输入WeatherForecast
这里设置了launchUrl,如果是MVc的项目会自动在地址的后面拼接上配置的launchUrl参数
加上swagger
控制台进行安装
点击控制台
这里一定要选择安装到哪个项目下面
比如我们再新建一个其他项目
还是添加一个dotnetcore的应用程序,
比如叫做MvcDemo
这样现在就有两个项目了
这个时候再安装包的话,一定选对是哪个项目进行安装
这样就是在我们的webapi项目里面安装swagger了
mvc的项目的startup里面,指定了默认的路由
webApi里面是没有指定对应的路由的
把mvc项目里面的路由配置复制过来。
然后F12 进入到MapControllers里面看看里面能不能设置一些参数。
好像是没有的
上面的复制过来,直接报错
手动去掉后面的,什么都不输入的话
代码恢复
配置swagger服务。
Doc配置版本号。
doc里面要新建配置项,OpenApiInfo,对象初始化器。
引用中间件的配置
先UseSwagger然后再UseSwaggerUI,用它的UI,在UI里面要写一些配置项。
配置项是莱姆达表达式。
要读取的json的文件,json文件是在项目生成的时候,自动生成的
V1要和上面配置的V1保持一致。如果不一致,那么就读取不到json文件。
前面是json的路径,后面是随便起的一个名字’
启动项目
手动输一下swagger/index
先把mvc的测试项目卸载掉。
设置默认启动页为swagger的页面。第一想到的可能是修改这个launchUrl
启动测试。,起作用了。
如果需要项目里面有一些中文标记。
通过Appdomain.CurrentDomain.BaseDirectory获取项目的根目录。根目录下的WebApiDemo.xml
右键项目—-选择属性
保存后,这里就有很多绿线
没写注释,就会有绿线
加上注释就没有绿线了
传参信息
例如这里加上一个参数
参数的描述
这里暂时先去掉,因为一旦打开,都会绿线的报错。
如果部署到IIS
继续
属性调试,这里也有默认的启动项
改成这个
其实读取的就是这里的launchUrl
其他方法指定默认启动页
首先来告诉swagger是干嘛用的。在这里加个断点。
我们来请求下这个接口。
进入到断点。wagger中实际访问的就是我们的接口。
abp里面是这么用的。
把这段代码删掉
这里改成返回IActionResult,返回IActionResult就可以进行Redirect ,页面重定向。
输入这个地址。
很快会重定向到swagger的地址。这就是abp里面这么用的。
简化一下地址
启动程序,
跳转到。这样不破坏原有的配置,实现了跳转。
创建新的Controller
添加一个api的空的控制器。
HomeController
返回一个string,直接return了一个ok。如果就这么写直接启动会报错。
如果要让我们的系统集成swagger,那么所有的接口必须要规范化。
加上[HttpGet]。设置了请求类型。
请求数据测试。
请求的接口地址是api/[controller]
可以在后面加上action
前面把api去掉了
多个action的情况
不要action
去掉了action。就不知道该请求哪个数据了。
直接报错。
restful风格
如果里面只有一个get方法
那么肯定就知道访问的是唯一存在的一个方法
一旦有两个方法,就不知道该请求哪一个了
这时候就用到重载。有参数并且返回类型为int
还是报错
restful风格需要加的东西
后面需要根一个i的参数。跟在我们Get后面的参数。
输入10 执行一下
返回10
不光是方法需要重载,路由也不能一样。
httppost的请求
put和delete
请求方式的不同,请求到不同路由里面去。
加上返回的信息区分
结合前端请求api接口测试。
打开VSCode,然后新建一个页面,生成html标准页面。
引入vue和axios
快捷键同时修改多行
shift+alt点击多行
然后Ctrl+D。把多行都选中。然后Ctrl+C都复制一下。
然后shift+Alt 选中id这里赋值
一下子全复制过来
在默认浏览器中打开
分别输出返回的数据
报错,跨域的问题
在后端加上断点
前端页面
点击前台页面的get
进入到后台的断点
点击前台post也进入到后台的post
点击前台put没有进入后台。delete也没有进入。
跨域是不能返回,但是可以进入到后台的断点。
本节课的重点
从dotnetCore3.0开始,controller里面多了这个 ApiController。以前在dotnetCore2.X的时候是没有这个的
F12进去,它是ControllerAttribute的子类。
还是先了IFilterMetadata的接口。
好处是对数据进行自动的推断,
不加ApiController,get请求的区别。运行测试。
加俩断点。
get2传一个i的参数值
get1可以正常进来
加一个get3 通过url这种方式去传值
进入到断点
一定要符合这种路由的格式,才会到这个断点来。
这里加一个i的参数。
点击get2
get4,这种方式去传值。
加上[FromBody]
进不去。问题出在axios再向get传递数据的时候,需要加上参数params
进入断点
以上是没有ApiController的情况
加上[ApiController]
结论:
也就是说 get请求和加不加ApiController没有影响。
测试几个post请求
新增加几个方法
前台post的传值
解决post传参的问题
前台不加参数 ,测试
请求可以进来,传值为null
传一个name
然后post就进不去断点了。
允许跨域
contrller上加上允许跨域
post请求。通过这种对象的传值方式。
后台接收不到数据。
WeatherforecostController.cs
WebapiDemo
Startup.cs
HomeControllercs
DWebApiDcmo
KWebAPIDemo.ControllcrsHomControllcr
月月付图*PICOmEYDTR门ex
[HttpGet]
0个引月
publicstringGe(sTring)
四羽设
return”这是Get”;
//http://localhsot:8888/home/i)
[HttpGet(“i))
0个5月
publicstringGeT(i)
return”这是Get带参数,参数是”+i;
[HttpPost]
0个3月
publicstringPost(string
intage)
nulli
name
return”这是POst”;
//HttpPut]
//publicstringPut)
//
![image.png](https://cdn.nlark.com/yuque/0/2020/png/192446/1606369998893-2fe8ae15-004e-4e5e-a065-a11dd2983d1f.png "image.png")
换成这种方式传值
这是表单格式的传值。也就是说只有是表单格式的传值,后端才可以获取到值。
如果是下面这种json格式的传值方式,后端获取不到值。
这是这两种方式,json对象传值方式是Request Payload.
参数+等号的传值是Form Data的形式
后端这里只能接受Form Data的格式的数据
方法2
还可以通过New URLSearchParams对象。然后Append键值对的形式去传值。
方法3:qs.js
这里因为没有这个库,只是代码模拟一下,
从后面的大项目里面用到的安装好的qs.js复制过来。
复制到当前这个演示项目里面。
引入后,这里就可以正常的使用了。
刷新页面,点击post
后端也可以获取到值了。
qs.stringify把json对象转换成了表单的形式,这样是可以进行post数据的传输的。
三种方式的总结:
1是拼接字符串:
方法2:、3
加上ApiController
到目前为止我们是没有ApiController的。现在我们把ApiController加上
1小时48分
这里字符写错了。应该是stringify
这里还是改成用postData的方式
进入到断点,参数都没有值。刚才没有加上[ApiController]的时候还能获取到值的。
改成json对象的形式
还是拿不到值。
加上[FromBody],那么第二个参数怎么办呢?
重点-加上[ApiController]后
加上apiController后,参数就不能通过这种形式,两个参数分别获取了
加上后,就逼着我们使用视图模型
添加Models文件夹。
创建UserInput类。
快捷键prop
自动生成的代码
创建name和age这两个属性
这里换成对象的形式
获取到了值。
如果不要ApiController
那么这里我们就需要加上[FromBody]
ApiController的好处
apiController是dotnetCore3.X才出现的。它的作用:
1:参数绑定策略的自动推断。
在apiController出现之前我们用的是[FromBody]
加上apiController之后我们这里就可以不用[FromBody]了。因为ApiController可以自动推断。
这样就不用再指定FromBody或者FromData了。它能够帮我们自动的推断。
2:自动的帮我们进行状态的验证。
如果我们去掉了ApiController,这里还是加上[FromBody]
那么我们就需要用到ModelState.IsValid来验证模型上的数据,
如果没有通过验证,要返回一个BadRequest,把状态返回回去。
如果我们使用了ApiController,它会自动帮我们的模型进行验证,如果没有验证通过,会自动返回400,badRequest
数据模型推断和模型状态的验证。
下节课开始 webApi过滤器的使用。然后就是手写过滤器。手写过滤器有一点点难。