第一節:微服務准備(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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM