C# WebApi傳參之Post請求-AJAX

来源:http://www.cnblogs.com/chenwolong/archive/2016/11/04/Post.html
-Advertisement-
Play Games

最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。 十年河東十年河西,莫欺少年窮。 學無止境,精益求精 上一節講述了C# WebApi傳參之Get請求-AJAX 本節講述C# WebApi傳參之Post請求-AJAX,說起Ajax針對webApi的Post請 ...


   最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。

   十年河東十年河西,莫欺少年窮。 

   學無止境,精益求精

   上一節講述了C# WebApi傳參之Get請求-AJAX

   本節講述C# WebApi傳參之Post請求-AJAX,說起Ajax針對webApi的Post請求,真的不敢恭維,確實比較怪異,如果你不幸要寫一個Ajax Post請求webApi介面,那麼您還是有必要花點時間看看本篇博客,如果你也遇到了同樣的問題,就不妨在最後給本篇博客點個贊。謝謝

   說起Post請求,想必大家都比較熟悉,post請求原理和get請求不一樣,我們知道get請求的參數是通過url來傳遞的,而post請求則是通過http的請求體中傳過來的,WebApi的post請求也需要從http的請求體裡面去取參數。說白了Get請求是通過URL傳遞一組鍵值對,Post請求是發送一個Http請求體。上一節Get請求,我們用到了[FromUri]關鍵字。本節的Post請求,我們將使用另一個關鍵字[FromBoay],上一節結尾我建議大家Get請求時要帶上[FromUri]關鍵字,同理,本節的Post請求,我要建議大家在接收參數時,帶上[FromBody]關鍵字,畢竟養成一個好的習慣不是什麼壞事。

   開篇中提到,Ajax Post請求webApi很怪異,那麼它究竟怎麼怪異呢?下麵以代碼示範說明:<本文仍舊採用上一節Get請求的實體對象,不知道的博友,請參閱我的上篇博客>

   如下:

        /// <summary>
        /// 簡單測試案例
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public string Get()
        {
            return "OK";
        }
        /// <summary>
        /// 通過id獲取特定數據
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        [HttpPost]
        public string GetById([FromBody]int Id)
        {
            list = list.Where(p => p.Id == Id).ToList();
            return JsonHelper.JsonSerializer<List<Person>>(list);
        }

   aJax如下

        //無參數請求-簡單示例
        $(document).ready(function () {
            $.ajax({
                url: "http://localhost:9953/api/Person/Get",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data:{},
                success: function (result,status) {
                    if (status == "success") {
                        alert(result);
                    }
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
        //單個參數傳遞-  data: {"":"3"}, 這種方式也竟然正確
        $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetById",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: {Id:"3"},
                success: function (result,status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });

   上文JS中註釋有這麼一句話:‘data: {"":"3"}, 這種方式也竟然正確’

   這是一種另許多人頭痛的寫法,但是沒辦法,經過測試,這種寫法確實很正確。

   根據上述案例,我們看到了Post請求傳遞單個參數的寫法,那麼如果傳遞多個參數,我們能否採取如下的方法?(經測試,如下寫法是錯誤的,報404Not Found)

  $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetByIdAndSex",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: { Id: "3",Sex:"W" },
                success: function (result, status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
        /// <summary>
        /// 錯誤的寫法    當然,本篇只講解Ajax請求,如果你是通過HttpwebClient的方式進行請求,這種寫法是沒有任何問題的
        /// </summary>
        /// <param name="Json"></param>
        /// <returns></returns>
        [HttpPost]
        public HttpResponseMessage GetByIdAndSex([FromBody]string Id,[FromBody]string Sex)
        {
            List<Person> list_2 = new List<Person>();
            var Result = from r in list
                         where r.Id == Convert.ToInt32(Id) && r.Sex == Sex
                         select r;
            foreach (var Item in Result)
            {
                list_2.Add(Item);
            }
            return ResultToJson.toJson(list_2);
        }

   測試的結果是:獲取不到Id 和 Sex 的值!開篇我們說到,Get的請求方式是通過URL傳遞鍵值對,而Post 請求傳遞的是一個Http請求體,而JS中 data: { Id: "3",Sex:"W" }, 採用的是鍵值對類型,而Post請求是不能讀取鍵值對滴。故:上述寫法不對。

   那麼,你可能會問,為什麼一個參數請求的時候沒有問題,為什麼兩個參數就不行了呢?這個...我能作的解答是:這就是Post Ajax請求的怪異之處。

   正確的寫法該當如何呢?

   我們知道:Get請求傳遞兼職對,Post請求傳遞的是Http的請求體,按照本人的理解就是:Post請求需要發送一個參數作為Http請求體,這個參數為一個整體,而非一組鍵值對、故而,我們作如下改動:

   代碼如下:

 //多個參數傳遞
        $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetByIdAndSex",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: JSON.stringify({ Id: "3",Sex:"W" }),
                success: function (result, status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
        /// <summary>
        /// 錯誤的寫法2 怪異吧
        /// </summary>
        /// <param name="Json"></param>
        /// <returns></returns>
        [HttpPost]
        public HttpResponseMessage GetByIdAndSex([FromBody]string Json)
        {
            string Id = JsonHelper.GetJsonValue(Json, "Id");//獲取Id
            string Sex = JsonHelper.GetJsonValue(Json, "Sex");//獲取sex
            List<Person> list_2 = new List<Person>();
            var Result = from r in list
                         where r.Id == Convert.ToInt32(Id) && r.Sex == Sex
                         select r;
            foreach (var Item in Result)
            {
                list_2.Add(Item);
            }
            return ResultToJson.toJson(list_2);
        }

   如上註釋為紅色加粗的JS代碼,我們將Post的鍵值對轉化為Json字元串傳遞到後端。而後端代碼中,我們嘗試接收這個JSon字元串,並作解析,從中讀出Id和Sex的值,按照Post請求規則,我們也是只發送了一個Http請求體,並且在後端作了接收。這次應該沒有問題了吧?

   實際測試的結果是:不會發生404 Not Found 錯誤,但是接收不到Post的字元串,也就是 [FromBody]string Json 中的Json為Null,(⊙o⊙)…

   靠,這樣都不行,那到底怎麼能行呢?

   下班了,不多噴了,直接告訴大家幾點註意事項:

   後端接收時,參數類型應採用dynamic,JS代碼中,必須加上contentType對應的類型,Post的值必須為一個整體,而不能是鍵值對。JS中Type類型必須為Post ,後端接收類型必須為:[HttpPost],如果不加,則會預設為[HttpGet]方式。

   以下是代碼示例,希望能幫助大家:

   1、多個參數傳遞:

 //多個參數傳遞
        $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetByIdAndSex",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: JSON.stringify({ Id: "3",Sex:"W" }),
                success: function (result, status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
 [HttpPost]
        public HttpResponseMessage GetByIdAndSex([FromBody]dynamic Json)
        {
            string Id = Json.Id;
            string Sex = Json.Sex;
            List<Person> list_2 = new List<Person>();
            var Result = from r in list
                         where r.Id == Convert.ToInt32(Id) && r.Sex == Sex
                         select r;
            foreach (var Item in Result)
            {
                list_2.Add(Item);
            }
            return ResultToJson.toJson(list_2);
        }

   2、傳遞一個對象數據

       //傳遞對象數組
        $(document).ready(function (data) {
            var dataList = [{ Id: "8888", Sex: "", Name: "陳卧龍", Age: "26" },
                            { Id: "8887", Sex: "", Name: "陳大龍", Age: "27" },
                            { Id: "8886", Sex: "", Name: "陳小龍", Age: "25" }];
            $.ajax({
                url: "http://localhost:9953/api/Person/GetByObjectList",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: JSON.stringify(dataList),
                success: function (result, status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
/// <summary>
        /// 對象數組作為參數
        /// </summary>
        /// <param name="P"></param>
        /// <returns></returns>
        [HttpPost]
        public HttpResponseMessage GetByObjectList([FromBody]dynamic Plist)
        {
            List<Person> list = new List<Person>();
            foreach (var item in Plist)
            {
                Person person = new Person()
                {
                    Name = item.Name,
                    Sex = item.Sex,
                    Id = item.Id,
                    Age = item.Age,
                };
                list.Add(person);
            }
            return ResultToJson.toJson(list);
        }

   到此為止:pOst請求也就講完了

  我們知道有四大請求:Get,Post,Put,Delete ,其中Put、delete請求都是採用的Post請求原理,他們直接大同小異,無非就是Put請求做修改 插入,Delete請求作刪除。因此:Put Delete 請求均可採用本文中的請求方式,只是他們所作的動作不一樣罷了!

   好了,回家清蒸魚嘍,最近學的拿手好菜,有喜歡的,歡迎品嘗,我們你們郵遞!哈哈,看了不評論,不點贊,不是好同志!

   @陳卧龍的博客

   


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

-Advertisement-
Play Games
更多相關文章
  • 基本過程 1) 調用 FileReader 的 reader.readAsDataURL(img); 方法, 在其onload事件中, 將用戶選擇的圖片讀入 Image對象. 2) 在image對象的 onload 事件中, 通過 canvas 的 canvas.getContext('2d') 的 ...
  • Unity的動態載入簡單使用Unity可以快速,輕量化的實現IOC,不用自已寫類似反射代碼來動態載入類或dll了使用Unity先要用nuget獲取相關引用文件Unity可通過代碼或config文件來配置要加動態載入的內容 使用示例 使用代碼配置載入項 使用Config配置載入項 ...
  • ...
  • 一:Reshaper簡介 Reshaper是C#開發IDE工具Visual Studio的一款第三方插件,Reshaper讓 VS 變得更強大。優勢是:它提供了一些在 VS 基礎上更方便於程式員開發的功能;劣勢是:它耗掉了更多的記憶體,有可能讓你不夠強大的開發機變得更慢。安裝完畢後,在Visual S ...
  • 其中 C#里 圖片和BASE64互轉的方法, 參見我的上一篇博客。 ...
  • ...
  • 從沒想到自己會開通博客,之前在編程上遇到問題 總會來到博客園來檢索點文檔看一下。 今天終於動手註冊開通了一個博客 希望能在這記錄下自己在程式世界的 一點一滴 每一步腳印 每一次進步 望大家共勉 ...
  • Cookies QueryString Application Session 1、利用cookies保持客戶端信息 .NET System Web 控制項名稱以下三個類,可以使用它們來處理客戶端的Cookies 1、HttpCookie:提供一個建立和操作獨立HTTPcookies的安全類型的方式 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...