• 第一节:微服务准备(Webapi复习、PostMan的使用、项目启动方式、业务代码准备)


    一. Core下WebApi复习

      详细的WebApi请移步:https://www.cnblogs.com/yaopengfei/p/11558525.html

    1. 路由规则配置

     简单粗暴:把作用于Controller上的特性改为: [Route("api/[controller]/[action]")],这样可以通过方法名来访问了。

     PS:也有其它的配置方式,这里不一一介绍了。

    2. 请求方式的接收

    (1).对于Get请求,可以分参数接收;也可以用实体接收,实体接收前面要加 [FromQuery];不能用dynamic接收。

    (2).对于Post请求

      A. 接收js默认的表单提交:用实体接收,前面加[FromForm]。

      B. 接收JSON提交:用实体/dynamic接收,前面[FromBody]可加可不加。

    补充PostMan的使用:

    用到的方法:

            /// <summary>
            /// 下单接口
            /// </summary>
            /// <param name="param">接收表单提交</param>
            /// <returns></returns>
            [HttpPost]
            public string pOrder2([FromForm]pOrderParam param)
            {
    
                var data = new
                {
                    status = "ok",
                    msg = $"用户{param.userId}下单了{param.num}个商品{param.goodId}"
                };
                return JsonHelp.ToJsonString(data);
            }
             /// <summary>
            /// 下单接口
            /// </summary>
            /// <param name="param">接收JSON格式提交</param>
            /// <returns></returns>
            [HttpPost]
            public string pOrder4([FromBody]pOrderParam param)
            {
    
                var data = new
                {
                    status = "ok",
                    msg = $"用户{param.userId}下单了{param.num}个商品{param.goodId}"
                };
                return JsonHelp.ToJsonString(data);
            }
    View Code

      A.Form表单提交:Body标签下选择【form-data】或【x-www-form-urlencoded】

      B.Json格式提交: 首先Headers标签下要设置【Content-Type=application/json】,然后再Body标签下选择【raw】,输入下面格式  { "userId":"ypf001", "goodId":"1111","num":222 }

     

    测试结果:

      对于Post请求Json的提交格式,后台用dynamic来接收的问题,用js代码测试时完全可以的(详见开篇webapi章节),但是这里用postman测试报500.(可能是我postman用的不对?欢迎指正)

    3. 返回值的处理

     (1).直接返回对应的类型的信息:GetMsg、GetGoodNum

     (2).返回JSON序列化的信息:GetGoodById1

     (3).使用Content方法:GetGoodById2

    PS:GetGoodById1和GetGoodById2的区别在于前端用不用再转一次了。 (详细见开头的 WebApi章节)

      [Route("api/[controller]/[action]")]
        [ApiController]
        public class CatalogController : ControllerBase
        {
            [HttpGet]
            public string GetMsg()
            {
                return "ypf";
            }
    
            [HttpGet]
            public int GetGoodNum(int id)
            {
                return id;
            }
    
            [HttpGet]
            public string GetGoodById1(int id)
            {
                var myData = new
                {
                    status = "ok",
                    goods = new Goods()
                    {
                        id = id,
                        goodName = "apple",
                        goodPrice = 6000,
                        addTime = DateTime.Now
                    }
                };
                var jsonData = JsonHelp.ToJsonString(myData);
                return jsonData;   //返回前端的数据不能直接点出来
            }
    
            [HttpGet]
            public IActionResult GetGoodById2(int id)
            {
                var myData = new
                {
                    status = "ok",
                    goods = new Goods()
                    {
                        id = id,
                        goodName = "apple",
                        goodPrice = 6000,
                        addTime = DateTime.Now
                    }
                };
                var jsonData = JsonHelp.ToJsonString(myData);
                return Content(jsonData, "application/json");    //返回前端的数据可以直接点出来
            }    
        }
    View Code

    二. Web项目指定端口的启动方式

    1. 启动项目

     (1). 启动项目:dotnet xxx.dll (eg:dotnet GoodsService.dll)

     (2). 指定配置启动: dotnet xxx.dll /test=123 test1=abc 或者 dotnet xxx.dll --test 123 --test1 abc

    2.指定ip+端口

     (1). 直接Url写死:UseUrls("http://127.0.0.1:7001"); 支持配置多个,然后直接通过 【dotnet xxx.dll 】启动即可。

     public static IHostBuilder CreateHostBuilder(string[] args) =>
               Host.CreateDefaultBuilder(args)
                   .ConfigureWebHostDefaults(webBuilder =>
                   {
                       //直接写死
                       webBuilder.UseStartup<Startup>().UseUrls("http://127.0.0.1:7001");
                   });

     (2). 在dll指定目录下设置环境变量:

      SET ASPNETCORE_URLS=http://127.0.0.1:7001 ,然后再运行程序 dotnet GoodsService.dll

     (3). 读取命令行中输入的指令

     前提:都需要添加命令行支持 var config = new ConfigurationBuilder().AddCommandLine(args).Build();

     A.写法1:dotnet GoodsService.dll --ip="127.0.0.1" --port=7001,需要UseUrls支持

     public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        //添加命令行支持(写在上面的Main里也可以)
                        var config = new ConfigurationBuilder().AddCommandLine(args).Build();
    
                        //写法一
                        var ip = config["ip"];
                        var port = config["port"];
                        webBuilder.UseStartup<Startup>().UseUrls($"http://{ip}:{port}");
    
                    });

     B.写法2:dotnet GoodsService.dll --urls="http://*:7001" --ip="127.0.0.1" --port=7001 ,不需要再配置任何东西了 (推荐!!)

            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        //添加命令行支持(写在上面的Main里也可以)
                        var config = new ConfigurationBuilder().AddCommandLine(args).Build();
    
                       //默认的 或 写法2 (配合命令行,支持写法2)
                        webBuilder.UseStartup<Startup>();         
                    });

    三. 业务代码准备

       新建WebApi项目,商品服务 GoodsService 和 订单服务 OrderService,工具类库 MicroUtils。

     1. GoodsService的代码准备

        [Route("api/[controller]/[action]")]
        [ApiController]
        public class CatalogController : ControllerBase
        {
            [HttpGet]
            public string GetMsg()
            {
                return "ypf";
            }
            [HttpGet]
            public int GetGoodNum(int id)
            {
                return id;
            }
            [HttpGet]
            public string GetGoodById1(int id)
            {
                var myData = new
                {
                    status = "ok",
                    goods = new Goods()
                    {
                        id = id,
                        goodName = "apple",
                        goodPrice = 6000,
                        addTime = DateTime.Now
                    }
                };
                var jsonData = JsonHelp.ToJsonString(myData);
                return jsonData;   //返回前端的数据不能直接点出来
            }
            [HttpGet]
            public IActionResult GetGoodById2(int id)
            {
                var myData = new
                {
                    status = "ok",
                    goods = new Goods()
                    {
                        id = id,
                        goodName = "apple",
                        goodPrice = 6000,
                        addTime = DateTime.Now
                    }
                };
                var jsonData = JsonHelp.ToJsonString(myData);
                return Content(jsonData, "application/json");    //返回前端的数据可以直接点出来
            }    
        }

     2. OrderService的代码准备

        [Route("api/[controller]/[action]")]
        [ApiController]
        public class BuyController : ControllerBase
        {
    
            [HttpPost]
            public string pOrder1()
            {
                return "ok";
            }
            /// <summary>
            /// 下单接口
            /// </summary>
            /// <param name="param">接收表单提交</param>
            /// <returns></returns>
            [HttpPost]
            public string pOrder2([FromForm]pOrderParam param)
            {
                var data = new
                {
                    status = "ok",
                    msg = $"用户{param.userId}下单了{param.num}个商品{param.goodId}"
                };
                return JsonHelp.ToJsonString(data);
            }
        }

    3. 工具类中序列化代码

        /// <summary>
        /// Json的序列化和反序列化
        /// 依赖程序集:【Newtonsoft.Json】
        /// </summary>
        public class JsonHelp
        {
     
            #region 01-将JSON转换成JSON字符串
            /// <summary>
            ///将JSON转换成JSON字符串
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static string ToJsonString<T>(T obj)
            {
                return JsonConvert.SerializeObject(obj);
            }
            #endregion
    
            #region 02-将字符串转换成JSON对象
            /// <summary>
            /// 将字符串转换成JSON对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="content"></param>
            /// <returns></returns>
            public static T ToObject<T>(string content)
            {
                return JsonConvert.DeserializeObject<T>(content);
            }
            #endregion
        }

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    图形学基础教程09--骨骼动画原理 (带演示程序)
    图形学基础教程08--光栅化原理
    图形学基础教程07--渲染到纹理 (带演示程序)
    图形学基础教程06--渲染状态二 (带演示程序)
    图形学基础教程05--渲染状态一 (带演示程序)
    图形学基础教程04--纹理和采样器 (带演示程序)
    图形学基础教程03--矩阵变换和光照 (带演示程序)
    图形学基础教程02--顶点数据和SHADER寄存器 (带演示程序)
    图形学基础教程01--渲染管线 (带演示程序)
    Jquery 全选、反选问题解析
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/12895957.html
Copyright © 2020-2023  润新知