1. 程式人生 > >終於知道怎麼在c#後臺發post請求了

終於知道怎麼在c#後臺發post請求了

正文

前言:還記得剛使用WebApi那會兒,被它的傳參機制折騰了好久,查閱了半天資料。如今,使用WebApi也有段時間了,今天就記錄下API介面傳參的一些方式方法,算是一個筆記,也希望能幫初學者少走彎路。本篇針對初初使用WebApi的同學們,比較基礎,有興趣的且看看。

WebApi系列文章

本篇打算通過get、post、put、delete四種請求方式分別談談基礎型別(包括int/string/datetime等)、實體、陣列等型別的引數如何傳遞。

回到頂部

一、get請求

對於取資料,我們使用最多的應該就是get請求了吧。下面通過幾個示例看看我們的get請求引數傳遞。

回到頂部

1、基礎型別引數

[HttpGet]
public string GetAllChargingData(int id, string name) { return "ChargingData" + id; }
複製程式碼
$.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetAllChargingData",
        data: { id: 1, name: "Jim", bir: "1988-09-11"},
        success: function (data, status) {
            if (status == "success") {
                $(
"#div_test").html(data); } } });
複製程式碼

引數截圖效果

 這是get請求最基礎的引數傳遞方式,沒什麼特別好說的。

回到頂部

2、實體作為引數

如果我們在get請求時想將實體物件做引數直接傳遞到後臺,是否可行呢?我們來看看。

複製程式碼
    public class TB_CHARGING
    {
        /// <summary>
        /// 主鍵Id
        /// </summary>
        public string ID { get; set; }

        /// <summary>
/// 充電裝置名稱 /// </summary> public string NAME { get; set; } /// <summary> /// 充電裝置描述 /// </summary> public string DES { get; set; } /// <summary> /// 建立時間 /// </summary> public DateTime CREATETIME { get; set; } }
複製程式碼
[HttpGet]
public string GetByModel(TB_CHARGING oData)
{
     return "ChargingData" + oData.ID;
}
複製程式碼
  $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetByModel",
        contentType: "application/json",
        data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });
複製程式碼

測試結果

由上圖可知,在get請求時,我們直接將json物件當做實體傳遞後臺,後臺是接收不到的。這是為什麼呢?我們來看看對應的http請求

原來,get請求的時候,預設是將引數全部放到了url裡面直接以string的形式傳遞的,後臺自然接不到了。

原因分析:還記得有面試題問過get和post請求的區別嗎?其中有一個區別就是get請求的資料會附在URL之後(就是把資料放置在HTTP協議頭中),而post請求則是放在http協議包的包體中。

根據園友們的提議,Get請求的時候可以在引數裡面加上[FromUri]即可直接得到物件。還是貼上程式碼:

複製程式碼
    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
    $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetAllChargingData",
        data: postdata,
        success: function (data, status) { }
    });
複製程式碼
        [HttpGet]
        public string GetAllChargingData([FromUri]TB_CHARGING obj)
        {
            return "ChargingData" + obj.ID;
        }

得到結果:

如果你不想使用[FromUri]這些在引數裡面加特性的這種“怪異”寫法,也可以採用先序列化,再在後臺反序列的方式。

複製程式碼
  $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetByModel",
        contentType: "application/json",
        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });
複製程式碼
        [HttpGet]
        public string GetByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData" + oData.ID;
        }

這樣在後臺得到我們序列化過的物件,再通過反序列化就能得到物件。

在url裡面我們可以看到它自動給物件加了一個編碼:

回到頂部

3、陣列作為引數

一般get請求不建議將陣列作為引數,因為我們知道get請求傳遞引數的大小是有限制的,最大1024位元組,數組裡面內容較多時,將其作為引數傳遞可能會發生引數超限丟失的情況。

回到頂部

4、“怪異”的get請求

為什麼會說get請求“怪異”呢?我們先來看看下面的兩種寫法對比。

(1)WebApi的方法名稱以get開頭

複製程式碼
    $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/GetByModel",
        contentType: "application/json",
        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });
複製程式碼
        [HttpGet]
        public string GetByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData" + oData.ID;
        }

這是標準寫法,後臺加[HttpGet],引數正常得到:

為了對比,我將[HttpGet]去掉,然後再呼叫

        //[HttpGet]
        public string GetByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData" + oData.ID;
        }

貌似沒有任何問題!有人就想,那是否所有的get請求都可以省略掉[HttpGet]這個標註呢。我們試試便知。

(2)WebApi的方法名稱不以get開頭

我們把之前的方法名由GetByModel改成FindByModel,這個再正常不過了,很多人查詢就不想用Get開頭,還有直接用Query開頭的。這個有什麼關係嗎?有沒有關係,我們以事實說話。

複製程式碼
    $.ajax({
        type: "get",
        url: "http://localhost:27221/api/Charging/FindByModel",
        contentType: "application/json",
        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });
複製程式碼
        [HttpGet]
        public string FindByModel(string strQuery)
        {
            TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);
            return "ChargingData" + oData.ID;
        }

貌似又可行,沒有任何問題啊。根據上面的推論,我們去掉[HttpGet]也是可行的,好,我們註釋掉[HttpGet],執行起來試試。

結果是不進斷點,有些人不信,我們在瀏覽器裡面看看http請求:

呵呵,這就奇怪了,就改了個方法名,至於這樣麼?還真至於!

博主的理解是:方法名以Get開頭,WebApi會自動預設這個請求就是get請求,而如果你以其他名稱開頭而又不標註方法的請求方式,那麼這個時候伺服器雖然找到了這個方法,但是由於請求方式不確定,所以直接返回給你405——方法不被允許的錯誤。

最後結論:所有的WebApi方法最好是加上請求的方式([HttpGet]/[HttpPost]/[HttpPut]/[HttpDelete]),不要偷懶,這樣既能防止類似的錯誤,也有利於方法的維護,別人一看就知道這個方法是什麼請求。

這也就是為什麼很多人在園子裡面問道為什麼方法名不加[HttpGet]就呼叫不到的原因!

回到頂部

二、post請求

在WebApi的RESETful風格里面,API服務的增刪改查,分別對應著http的post/delete/put/get請求。我們下面就來說說post請求引數的傳遞方式。

回到頂部

1、基礎型別引數

 post請求的基礎型別的引數和get請求有點不一樣,我們知道get請求的引數是通過url來傳遞的,而post請求則是通過http的請求體中傳過來的,WebApi的post請求也需要從http的請求體裡面去取引數。

(1)錯誤的寫法

複製程式碼
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { NAME: "Jim" },
        success: function (data, status) {
            if (status == "success") {
                $("#div_test").html(data);
            }
        }
    });
複製程式碼
        [HttpPost]
        public bool SaveData(string NAME)
        {
            return true;
        }

這是一種看上去非常正確的寫法,可是實際情況是:

(2)正確的用法

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { "": "Jim" },
        success: function (data, status) {}
    });
        [HttpPost]
        public bool SaveData([FromBody]string NAME)
        {
            return true;
        }

這是一種另許多人頭痛的寫法,但是沒辦法,這樣確實能得到我們的結果:

我們一般的通過url取引數的機制是鍵值對,即某一個key等於某一個value,而這裡的FromBody和我們一般通過url取引數的機制則不同,它的機制是=value,沒有key的概念,並且如果你寫了key(比如你的ajax引數寫的{NAME:"Jim"}),後臺反而得到的NAME等於null。不信你可以試試。

上面講的都是傳遞一個基礎型別引數的情況,那麼如果我們需要傳遞多個基礎型別呢?按照上面的推論,是否可以([FromBody]string NAME, [FromBody]string DES)這樣寫呢。試試便知。

(1)錯誤寫法

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { "": "Jim","":"備註" },
        success: function (data, status) {}
    });
        [HttpPost]
        public bool SaveData([FromBody]string NAME, [FromBody] string DES)
        {
            return true;
        }

得到結果

這說明我們沒辦法通過多個[FromBody]裡面取值,此法失敗。

(2)正確用法

既然上面的辦法行不通,那我們如何傳遞多個基礎型別的資料呢?很多的解決辦法是新建一個類去包含傳遞的引數,博主覺得這樣不夠靈活,因為如果我們前後臺每次傳遞多個引數的post請求都去新建一個類的話,我們系統到時候會有多少個這種引數類?維護起來那是相當的麻煩的一件事!所以博主覺得使用dynamic是一個很不錯的選擇。我們來試試。

複製程式碼
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify({ NAME: "Jim",DES:"備註" }),
        success: function (data, status) {}
    });
複製程式碼
        [HttpPost]
        public object SaveData(dynamic obj)
        {
            var strName = Convert.ToString(obj.NAME);
            return strName;
        }

通過dynamic動態型別能順利得到多個引數,省掉了[FromBody]這個累贅,並且ajax引數的傳遞不用使用"無厘頭"的{"":"value"}這種寫法,有沒有一種小清新的感覺~~有一點需要注意的是這裡在ajax的請求裡面需要加上引數型別為Json,即 contentType: 'application/json', 這個屬性。

(3)推薦用法

通過上文post請求基礎型別引數的傳遞,我們瞭解到了dynamic的方便之處,為了避免[FromBody]這個累贅和{"":"value"}這種"無厘頭"的寫法。博主推薦所有基礎型別使用dynamic來傳遞,方便解決了基礎型別一個或多個引數的傳遞,示例如上文。如果園友們有更好的辦法,歡迎討論。

回到頂部

2、實體作為引數

(1)單個實體作為引數

上面我們通過dynamic型別解決了post請求基礎型別資料的傳遞問題,那麼當我們需要傳遞一個實體作為引數該怎麼解決呢?我們來看下面的程式碼便知:

    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        success: 
            
           

相關推薦

終於知道怎麼在c#後臺post請求

正文前言:還記得剛使用WebApi那會兒,被它的傳參機制折騰了好久,查閱了半天資料。如今,使用WebApi也有段時間了,今天就記錄下API介面傳參的一些方式方法,算是一個筆記,也希望能幫初學者少走彎路。本篇針對初初使用WebApi的同學們,比較基礎,有興趣的且看看。WebApi系列文章本篇打算通過get、po

c#後臺post請求獲取資料

C#進階系列——WebApi 介面引數不再困惑:傳參詳解 閱讀目錄 一、get請求 1、基礎型別引數 2、實體作為引數 3、陣列作為引數 4、“怪異”的get請求 二、post請求 1、基礎型別引數

Vue axiospost請求後臺接收不到引數的三種解決方案:

最近用vue做專案使用axios傳送post請求時遇到了前端傳資料後端接收不到的情況: 程式碼: 後來仔細對比ajax發現axios傳值是這樣的: 而ajax傳值是這樣的: 一個Request Payload,一個Form Data。 將Request Payload 轉為Fo

前端向後臺請求有幾種方式?

發送請求 ajax nbsp a標簽 lin 請求 ram class img 1、 link標簽的href屬性 2、 script標簽的src屬性 3、 img標簽的src屬性 4、 ajax發送請求 5、 表單提交發送請求 6、 a標簽的href發送請求 7、 ifra

java後臺請求並獲取返回值

otto wid eight quest 所有 ica 輸出流 lds thead 項目中需要前端發送請求給後端,而後端需要從另一個平臺中取數據然後再透傳給前端,通過下述代碼將其實現.在此記錄一下.package com.autotest.utils;import java

C# 後臺處理http請求

處理 IT 方式 span 亂碼 bottom AD bytearray ret using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using Syst

sql語句----drop、truncate和delete 精闢解析--終於知道ID為啥有時候不連續

雖然西西不建議大家去用命令刪除資料庫表中的東西,但是這些刪除命令總有用的著的地方。 說到刪除表資料的關鍵字,大家記得最多的可能就是delete了 然而我們做資料庫開發,讀取資料庫資料.對另外的兩兄弟用得就比較少了 現在來介紹另外兩個兄弟,都是刪除表資料的,其實也是很容易理解的 老大-----

後臺發起post請求,並返回請求結果

1.感謝 https://blog.csdn.net/Java_Long_Asus/article/details/82906135 2.程式碼 /** * 向指定的 URL傳送遠端POST方法的請求 * @param url傳送請求的 URL * @param js

Java後臺傳送post請求,並接收返回資訊

/** * 向指定的 URL傳送遠端POST方法的請求 * @param url傳送請求的 URL * @param json請求引數, * @return 所代表遠端資源的響應結果 */ public static JSONObject sendPost(String

axios post 請求,後端接收不到引數的詳細解決方案

  問題描述 :axios post 請求或者get請求後接收不到引數 後端接收設定: @RequestParam @RequestBody設定的原因   由於spring的RequestParam註解接收的引數是來自於request

java 後臺通過post請求 上傳檔案

文章轉載:https://blog.csdn.net/wohaqiyi/article/details/77621517   import microservice.fpzj.control.base.BaseController; import org.springframewo

java 用httppost請求

package com.psds.zhengxin.apiweb.util; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException;

C# 實現HTTP POST請求與接收響應

       用C#實現HTTP請求比較容易實現。根據網上的程式修改而成,實現程式碼如下: using System; using System.Collections.Generic; using System.ComponentModel; using System

使用cors解決跨域,ionic打包到android手機上post請求報403錯誤

如題,百度了一圈也沒有找到答案,最後翻了個牆,最終找到了外國友人的答案: My backend is using Tomcat, one of the tomcat filters is designed for handle CORS request, it named

C#後臺傳送HTTP請求

HttpResponse 1.涵蓋POST,GET方法 using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; usi

C# get與post請求,在一般處理程式handler中的應用Request.QueryString和Request.Form的用法,利用postman工具進行請求

一、Get 請求 1.引數存放在請求頭中header。(postman工具能夠證明,Body不可選) 2.字串大小有限制,需要小於2k位元組。 3. handler 接受引數Request.Q

phppost請求

function curl_post($url,$data) { $AccessKey="4605e996a4de4c39a82b8b5f0ab0f4a9"; $ApiKey="e702c0e48fed402d8d051d8c234c291c"; /*$pos

終於知道程式設計師為什麼沒女朋友

認識個做IT的朋友,上海外企工作,待遇不錯。87年的,今年虛歲也31了,還沒有女朋友。恰好和我合租的一個女孩單身,想著做件好事,撮合下他倆。於是有了下面的對話:我差點無語,追女孩和天氣熱追女孩有毛關係啊。照你這麼說廣大非洲朋友是不是都要孤獨終老了。後來把這事兒忘得差不多了,突然有一天這朋友聯絡我了:好吧,看在

C# 模擬 HTTP POST請求

.get sum ram tls text oid vat con tick /// <summary> /// 用於以 POST 方式向目標地址提交表達數據 /// 使用 application/x-www-form-urlencode

終於知道公司前端為啥不加班

摘要:如何快速、高效地構建前端元件乃至頁面是解放前端生產力的重要標誌,掌握抽象元件和頁面模型,理解前端視覺化搭建思路,擺脫固有的開發模式,提高前端開發效率,是每位前端應該瞭解的。 本文分享自華為雲社群《【雲駐共創】前端視覺化框架是怎樣煉成的?》,原文作者:華為雲EI專家胡琦。 隨著移動網際網路的迅猛發展和 5