【WebApi系列】詳解WebApi如何傳遞參數

来源:https://www.cnblogs.com/wangjiming/archive/2018/01/30/8378108.html
-Advertisement-
Play Games

WebApi系列文章 【01】淺談HTTP在WebApi開發中的運用 【02】聊聊WebApi體繫結構 【03】詳解WebApi參數的傳遞 【04】詳解WebApi測試和PostMan 【05】淺談WebApi Cores 【06】詳解WebApi 異常處理 【07】用WebAPI寫個基於EF的CU ...


WebApi系列文章

【01】淺談HTTP在WebApi開發中的運用

【02】聊聊WebApi體繫結構

【03】詳解WebApi參數的傳遞

【04】詳解WebApi測試和PostMan

【05】淺談WebApi Cores

【06】詳解WebApi 異常處理

【07】用WebAPI寫個基於EF的CURD

【08】淺談WebAPI身份認證

【09】詳解系列化和模型綁定

【10】淺談WebApi如何配合Mvc有效工作

【11】淺談API Reference

【12】淺談介面在軟體架構中的作用

【13】淺談WebApi和WebService的比較

【14】淺談如何設計一個良好的介面

                                                                     

 


閱讀目錄

一     概述

二    Get

    1   基礎數據類型

        1.1  方法只含一個形參

        1.2  方法含多個形參

    2   實體對象類型

    3   實體對象和基礎數據類型混合

    4   最小滿足原則

    5   url長度限制

    6   Get規範化

    7    關於實體作為參數傳遞的拓展

         7.1   藉助[FromUri]特性傳遞實體

         7.2   系列化和反系列化傳遞實體

三    Post

    1   基本數據類型傳遞

         1.1   [FromBody]單個參數傳遞

         1.2  Dynamic單個參數傳遞

    2   實體作為參數傳遞

    3   實體集合作為參數傳遞

    4   數組作為參數傳遞

    5   小結

四   總結

 

 一 概述

一般地,我們在研究一個問題時,常規的思路是為該問題建模;我們在研究相似問題時,常規思路是找出這些問題的共性和異性。基於該思路,我們如何研究WebApi參數傳遞問題呢?

首先,從參數本身來說,種類較為多(如int,double,float,string,array,Object等),且有些類型較為複雜(如值類型和引用類型的機制等);

其次,從基於WebApi的Http請求方法來說,種類多且不盡相同(如Get,post,Delete,put,head等),在上一篇文章 :【WebApi系列】淺談HTTP在WebApi開發中的運用  中,我們簡要描述了Http請求的20個方法;

..........

如此複雜且不盡相同,關於WebApi參數傳遞,我們該選擇什麼作為切入點來研究呢?基於我們上面提到的研究思路,我們想到了.NET Framework框架,那麼,我們來看看基於.NET Framework框架的的WebApi

模板是怎樣的呢?

請按圖中步驟操作

我們來看看Values控制器是怎樣的

 1  public class ValuesController : ApiController
 2     {
 3         // GET api/values
 4         public IEnumerable<string> Get()
 5         {
 6             return new string[] { "value1", "value2" };
 7         }
 8 
 9         // GET api/values/5
10         public string Get(int id)
11         {
12             return "value";
13         }
14 
15         // POST api/values
16         public void Post([FromBody]string value)
17         {
18         }
19 
20         // PUT api/values/5
21         public void Put(int id, [FromBody]string value)
22         {
23         }
24 
25         // DELETE api/values/5
26         public void Delete(int id)
27         {
28         }
29     }

從Values控制器,我們不難得出如下幾個結論:

(1)WebApi常規方法為四個:Get,Post,Put和Delete;

(2)四種方法的參數可歸結為兩大類:url傳遞(Request-url)和Body(Request-body)傳遞;

(3)基於(2),我們將四種方法的參數傳遞歸為兩大類,而這兩大類又集中在Get和Post中體現了(Put是Get和Post的組合,Delete與Get類似);

 

其實,分析到現在,我們很容易找得到了研究WebApi參數傳遞的切入點?研究Get和Post方法參數傳遞即可。是的,沒錯,我們本篇文章就是基於Get和Post方法的參數傳遞,前者對應Request-url,後者對應Reqeust-Body。

二  Get

1  基礎數據類型


 

1.1  方法只含一個形參(參數傳得進去)

ajax

$(document).ready(function () {
   $("#FindProdcutDetail").click(function () {
       $.ajax({
               type: "Get",
               //url: "/api/Default/GetProductDetails?ProductCode=JX80869"
               url: "/api/Default/GetProductDetails",
               data: { "ProductCode":"JX80869"}
            })
        })           
   })

Result

 總結

(1)當Get方法形參為一個且為基本數據類型時,Get方法能接受外部傳遞的值

(2)Get傳值的本質是通過url字元串拼接,如上兩兩種url形式的傳遞的結果都是一樣

url形式1

url: "/api/Default/GetProductDetails?ProductCode=JX80869"

url形式2

url: "/api/Default/GetProductDetails",
data: { "ProductCode":"JX80869"}

我們用Goole Chrome來看看結果,發現url形式1和url形式2均一致

(3)Get傳遞參數本質是url字元串拼接,Request-Head頭部傳遞,Request-Body中不能傳遞(這是與Post方法的本質區別),我們舉兩個例子

例子1:我們將形參添加[FromBody]屬性後,值傳遞不進去

例子2:我們用PostMan來測試,發現PostMan中,Get方法參數Body為灰色,是不能選中的

 

1.2  方法含有多個形參(參數傳得進去)

$(document).ready(function () {
   $("#FindProdcutDetail").click(function () {
      $.ajax({
               type: "Get",
               url: "/api/Default/GetProductDetails",
               data: { "ProductCode": "JX80869","ProductName":"YaGao"}
            })
        })
  })

result

2   實體對象類型(參數傳不進去)


 model

 1  public class ProductDetail
 2     {
 3         //產品編碼
 4         [Required]
 5         public string ProductCode { get; set; }
 6         //產品名稱
 7         [Required]
 8         public string ProductName { get; set; }
 9         //產品價格
10         [Required]
11         public double  ProductPrice{ get; set; }
12     }

ajax

$(document).ready(function () {
    var productDetail = { "ProductName": "YaGao", "ProductCode": "JX80869", "ProductPrice": 40.5};
        $("#FindProdcutDetail").click(function () {
            $.ajax({
                    type: "Get",
                    url: "/api/Default/ProductDetails",
                    data: productDetail
                })
            })
        })

result:

 分析

3   實體對象和基礎數據類型混合(實體傳不進去,基礎數據能傳遞進去)


 ajax

1 $(document).ready(function () {
2    $("#FindProdcutDetail").click(function () {
3        $.ajax({
4                 type: "Get",
5                 url: "/api/Default/GetProductDetails",
6                 data: { "_productDetail": "ObjectEntity","ProductName":"YaGao"}
7              })
8         })
9     })

 result

4  最小滿足原則(參數傳得進去)


 所謂“最小滿足原則”,指外部參數必須至少滿足被調用方法的形參(形參個數,形參類型和形參名字),換句話說,被調用方法具有的形參,外部參數必須傳遞進來,被調用方法沒有

的形參,外部參數傳遞與否都可以,否則將會產生狀態碼404錯誤,用數學集合的思路來理解的話,被調用方法的形參相當於外部參數的子集。如下例子,我們舉一個真子集的例子,

即外部傳遞參數的個數大於被調方法的的形參個數。

Ajax

 $(document).ready(function () {
    $("#FindProdcutDetail").click(function () {
       $.ajax({
                type: "Get",
                url: "/api/Default/GetProductDetails",
                data: {"ProductCode": "JX00034", "ProductName": "YaGao", "ProductPrice": 20.5, "PrudcutType": "Daily Necessities"}
                })
            })
        })

result

 分析:主要原因是路由規則,路由從url裡面取參數與aciton參數匹配,直到匹配滿足為止,具體詳細深入內容,在【WebApi系列】路由章節分析。

5  url長度限制


 url參數長度是有一定限制的,當超過一定長度,會報404錯誤

ajax

 $(document).ready(function () {
            $("#FindProdcutDetail").click(function () {
                $.ajax({
                    type: "Get",
                    url: "/api/Default/GetProductDetails",
                    data: {
                        "ProductCode":
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
                        "JX00034xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
                    }
                })
            })
        })

result

6  Get規範化


 關於Get類型規範化,應註意兩點,避免不必要的錯誤或異常:(1)方法的命名儘量採用:“Get+方法名”的形式 (2)在每個方法上加上特性[HttpGet]。

例子:我們去掉[HttpGet]特性和方法前的Get,看看情況什麼怎樣的

ajax

$(document).ready(function () {
    $("#FindProdcutDetail").click(function () {
        $.ajax({
                 type: "Get",
                 url: "/api/Default/ProductDetails",
                 data: {"ProductCode": "JX00034 "}
             })
         })
    })

Controller

1 public class DefaultController : ApiController
2     {
3         4         //[HttpGet]
5         public string ProductDetails(string ProductCode)
6         {
7             return "values";
8         }
9     }

 Result

7  關於實體作為參數傳遞的拓展


 

7.1  藉助[FromUri]特性傳遞實體

ajax

$(document).ready(function () {
   var GetEntityParam = { "ProductName": "YaGao", "ProductCode": "JX80869", "ProductPrice": 40.5};
      $("#FindProdcutDetail").click(function () {
        $.ajax({
                 type: "Get",
                 url: "/api/Default/ProductDetails",
                 data: GetEntityParam
               })
           })
      })

result

7.2  系列化與反系列化傳遞實體

ajax

$(document).ready(function () {
   $("#FindProdcutDetail").click(function () {
       $.ajax({
                type: "Get",
                url: "/api/Default/ProductDetails",
                data: { "productDetail": JSON.stringify({ "ProductName": "YaGao", "ProductCode": "JX80869", "ProductPrice": 40.5 }) }
             })
         })
     })

 result

 

8  小結


 (1)Get參數傳遞的本質是url字元串拼接;

 (2)url字元串長度受限制;

 (3)Get參數傳遞在Http請求頭部傳遞,而不支持Request-Body傳遞;

 (4)Get類型的方法支持參數為基本類型,不支持實體類型;

 (5)Get類型的方法命名,應儘量採用“Get+方法名”的命名方式,且習慣性地在方法前加上[HttpGet特性];

 (6)實參與形參的匹配,遵循路由規則;

(7)Get對應DB的Select操作,從這一點來理解,就知道為什麼Http不支持實體對象傳遞的合理性了,因為一般情況,我們都是通過簡單的欄位查詢信息(對應基本類型),

如ID號,用戶名等,而不會通過一個實體查詢數據;

 三    Post 

1  基本數據類型傳遞


 

1.1  [FromBody]單個參數傳遞

ajax

result

1.2 dynamic單個參數傳遞

 ajax

$(document).ready(function () {
   $("#FindProdcutDetail").click(function () {
      $.ajax({
               type: "Post",
               contentType: 'application/json',
               url: "/api/Default/PostParamToProducts",
               data: JSON.stringify({"ProductCode":"JX00039"})
           })
       })
   })

result

Googel Chrome查看

2 實體作為參數傳遞


 ajax

$(document).ready(function () {
   $("#FindProdcutDetail").click(function () {
      $.ajax({
               type: "Post",
               url: "/api/Default/PostParamToProducts",
               data: { "ProductCode": "JX00036","ProductName":"YaGao","ProductPrice":20.5}
            })
        })
    })

result

我們用Googel  Chrome看看

3 實體集合作為參數傳遞


 ajax

$(document).ready(function () {
   var list_ProductDetail = [
       { "ProductCode": "JX00031", "ProductName": "ToothPaste", "ProductPrice": "20.5" },
       { "ProductCode": "JX00032", "ProductName": "ToothBrush ", "ProductPrice": "18.9" },
       { "ProductCode": "JX00033", "ProductName": "Pen", "ProductPrice": "199.9" },
       { "ProductCode": "JX00034", "ProductName": "computer", "ProductPrice": "15000.5" }
       ]
   $("#FindProdcutDetail").click(function () {
   $.ajax({
             type: "Post",
             contentType: 'application/json',
             url: "/api/Default/PostParamToProducts",
              data: JSON.stringify(list_ProductDetail)
          })
      })
  })

 result

Google Chrome 查看

4  數組作為參數傳遞


 ajax

$(document).ready(function () {
   var arr = ["a", "b", "c", "d"];
   $("#FindProdcutDetail").click(function () {
      $.ajax({
               type: "Post",
               contentType: 'application/json',
               url: "/api/Default/PostParamToProducts",
               data: JSON.stringify(arr)
            })
       })
  })

Result

我們用Google Chrome看看

5  小結


 (1)Post參數傳遞本事是在Request-Body內傳遞,而Get參數傳遞本質是url拼接;

(2)Post參數傳遞不是key/value形式,而Get參數是key/value形式;

(3)Post傳遞參數時,無論是單個參數還是對象,均藉助[FromBody]特性(當然,某些情況去掉[FromBody]特性也可把值傳遞進去,但未了規範化,儘量加上該特性);

(4)Post沒長度限制,而Get有長度限制(一般為1024b);

(5)Post相對Get,較安全;

(6)Post操作相當於DB的Insert操作;

四  總結

1.雖然HTTP請求方法有20多種,常用的大致為4種,即Get,Post,Put,Delete(當然,像Trace,Head等也常用);

2.Get,Post,Put,Delete分別對應DB的Select,Insert,Update和Delete操作;

3.WebApi參數類型,大致分為基本數據類類型和對象數據類型(當然你也可以理解為抽象數據類型);

4.研究WebApi參數傳遞,只需研究Get和Post即可,因為其他http方法參數傳遞基本都是有這兩種組合而成(如Put有Get和Post組合而成),或者相似(如Delete與Get相似);

5.對於控制器方法,儘量參照規範格式寫,如在相應控制器方法上加上對應的htt請求(Get對應[HttpGet],Post對應[HttpPost]),方法名儘量採用“Http請類型+方法名”格式(如Get請求,建議採用Get+MethodName;Post請求對應Post+MethodName);

6.WebApi參數請求,大致分為兩大類型,即Request-url和Request-body;

7.文中我們還簡要分析了Get和Post區別;

8.關於如何設計一個良好的介面,在文章中,我們觸及了一下,但未研究,會在後續的文章中單獨分析;

五   版權區

 

  • 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
  • 博主網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]
  • 可以轉載該博客,但必須著名博客來源。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用親身經歷告訴你,在你的併發程式代碼塊中,最好最好不要有引用類型,必要的string類型還是可以的。目前正在把自己前段時間寫的併發程式放到自己的項目中,以提高速度,由於我的項目是與移動對接的,因此,詢問了移動的介面能不能響應高併發之後,並且得到了肯定的答覆,我就開始著手demo設計了,但是一直出錯, ...
  • 在上一篇文章中,我們實現了使用命令行來啟動 UWP 應用,在這一篇文章中,我們會實現 UWP 應用自啟用的實現,也即開機後或用戶登陸後,應用自己啟動。這些特性原來都是 Win32 程式所具備的,UWP 能夠支持這些特性使得它和 Win32 程式的行為進一步相同。 實現 與實現命令行啟動一樣,實現自啟 ...
  • 在WPF里使用MVVM開發的時候,似乎總是不可避免的會遇到這樣一個問題:ViewModel在處理完業務之後需要關閉這個Window,這時候要怎麼處理? 網上有很多解決方案:有的在ViewModel拋出一個事件,在View端使用(XXXViewModel)this.DataContext的方式去響應事 ...
  • 最近在看騰訊視頻的時候發現下載下來的視頻格式都是qlv格式,且不能用其他播放器播放,甚是惱怒,網上找了很多方法都很繁瑣,於是自己寫了一個小程式來處理這個問題。把下載下來的qlv格式轉化為MP4格式 首先還是按照網上所說的,找到這些文件所在位置: 首先將需要轉換mp4格式的視頻下載,要下載完成才能進行 ...
  • 演示產品源碼下載地址:http://www.jinhusns.com/Products/Download 演示產品源碼下載地址:http://www.jinhusns.com/Products/Download ...
  • 前言 年底工作比較忙,年度總結還沒寫,項目要上線,回老家過年各種準備。尤其是給長輩給侄子侄女準備禮物頭都大了。 原來想年前先出一版能用的,我看有點懸了,儘量先把大體功能弄出來,扔掉一些,保證能考試,然後再搞點擴展的東西。 本節主要是做一下EF的封裝,在DDD設計中,有兩個概念不得不提,工作單元模式和... ...
  • 原因就是C#中使用多線程使用HttpWebRequest時,預設的連接數只有2。 然後有時候因為對方伺服器的原因導致訪問超時,如果沒有做超時處理的話,request對象就不會被釋放,後面便導致一系列的問題。 解決方法之一就是在調用HttpWebRequest對象之前將連接數改大。 在一般處理程式中添 ...
  • Options 選項 OptionsBehavior 視圖的行為選項 AllowAddRows 允許添加新數據行 AllowDeleteRows 允許刪除數據行 AllowIncrementalSearch 允許用戶通過輸入想得到的列值來定位行 AllowPartialRedrawOnScrolli ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...