第一节:微服务准备(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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2020-05-15 17:02  Yaopengfei  阅读(1555)  评论(3编辑  收藏  举报