-
.net core环境搭建
安装hosting,等……
-
webapi
-
新建
新建webapi项目,选api。
-
启动方式
IIS启动。直接F5;
bin目录下cmd启动,输入命令dotnet 项目dll --urls="http://*:2020 " --ip="127.0.0.1" --port="2020"
浏览器中输入指定的地址。注意的是,api没有默认路由,所以要加上路由。
注意:
mvc指定了路由,api没有默认路由。所以访问api的时候,需要手动输入路由
-
集成swaggerui
- nuget添加引用包:swashbuckle.aspnetcore;
- configureservice中添加配置项,还可以配置注释。
- configure中配置
-
如何设置api打开页面的默认地址
- lanchSetting.json中设置launchUrl的值;
- 项目/属性/调试/启动浏览器
-
添加控制器
api地址默认restful风格
注意route和[apicontroller]特性
apicontroller特性:
core3.x出现;
有没有【apicontroller】特性,对GET请求没有影响。
//命中路由GetValue1,此时i=null。如果GetValue1()中没有参数,一样命中
document.querySelector("#Get1").onclick=function() { axios.get("http://localhost:37318/api/Home").then(function(r){ console.log(r.data); }) } //命中路由GetValue2 document.querySelector("#Get2").onclick=function() { axios.get("http://localhost:37318/api/Home/111").then(function(r){ console.log(r.data); }) } document.querySelector("#Get3").onclick=function()//命中路由GetValue1,此时i=11。如果GetValue1()没有参数,一样命中 { axios.get("http://localhost:37318/api/Home?i=11").then(function(r){ console.log(r.data); }) }
[HttpGet] public string GetValue1(string i) { return "GetValue1"; } [HttpGet("{i}")] public string GetValue2(int i) { return "GetValue2"+i; }
-
结论
http://localhost:37318/api/Home/111命中[HttpGet("{id}")]这种情况,其他路由地址都命中【HttpGet】这种情况,区别只是参数是否获取到的问题。
POST:【apicontroller】的特性影响比较大;
-
没有【apicontroller】特性的时候:
在前端以{name:"",age:""}这种json格式传递的时候,参数无法传到后端(有跨域问题,报405错误。)(request payload类型的参数),但是如果加上frombody就可以接收到参数。
如果改成{name="zhangsan"}这种表单格式的数组(Form data类型的参数),后端接口不加frombody就可以取到值,不用实体也可以接收到参数值。下面两种方式也可以往后端传值
- UrlSearchParams
- qs.stringify({name:"zhangsan",age:18})。 这种方式待验证
-
有apicontroller特性
上面的方法一和方法二都无法把参数传给后端接口。如果用json格式的数组传值给后端也不行。
这时候只能使用视图模型了。具体就是封装成对象。
但是如果没有加上apicontroller特性,用视图模型,后端接口仍然不能接受到参数。视图类前面需要加上【Frombody】才能接受到前端传过来的参数。
-
小结
apicontroller是.net core 3.x后才出现的特性。它的作用如下:
- 参数绑定策略的自动推断
3.x之前我们直接用【frombody】,之后我们加上这个特性,就不需要【frombody】了。apicontroller特性可以自动推断视图模型绑定的参数。
- 自动对数据模型的状态进行验证
没加特性,需要在方法中手动验证model上的验证是否通过,用modestate.isvalid()验证。加上特性后,自动验证,没通过就自动返回badrequest();
-
restful风格需要注意点
- 有路由配置,走路由配置
- 没有路由配置走特性
- 同一个方法重载后无法区分,还需要在特性中添加对应的参数
-
vscode快捷键
左键+alt+shift, 选中某个区域;再按住ctrl+d,则可以选中这一列到下一个标签前的文本
-
如何设置跨域
get,post,put,delete这些特性都是补充路由,是为了更精准的找到api;
GetPostPutDelete