一. 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); }
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"); //返回前端的數據可以直接點出來 } }
二. 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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。