webapi第一天

  • .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); }) }
 document.querySelector("#Get4").onclick=function()//此时命中GetValue1,但是参数传递失败
        {
            axios.get("http://localhost:37318/api/Home",{i:111}).then(function(r){

                console.log(r.data);
            })
        }

        document.querySelector("#Get5").onclick=function()//此时命中GetValue1,但是参数传递成功
        {
            axios.get("http://localhost:37318/api/Home",{params:{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

posted @ 2021-05-22 11:36  wesley1680  阅读(69)  评论(0编辑  收藏  举报