zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [HAOI2008]糖果传递
    [HAOI2008]木棍分割
    [HAOI2008]硬币购物
    [ZJOI2008]泡泡堂
    [JSOI2007]建筑抢修
    [JSOI2007]麻将
    [Note]prufer
    [BZOJ3275]Number
    [POI2014]RAJ-Rally
    [JSOI2010]快递服务
  • 原文地址:https://www.cnblogs.com/wesley168/p/14798453.html
Copyright © 2011-2022 走看看