WebApi接口傳參詳解

本篇通過get损离、post哥艇、put岸售、delete四種請求方式分別談談基礎類型(包括int/string/datetime等)职烧、實體、數(shù)組等類型的參數(shù)如何傳遞别厘。
一怎棱、get請求
1哩俭、基礎類型參數(shù)

[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);
            }
        }
    });

2、實體作為參數(shù)
如果我們在get請求時想將實體對象做參數(shù)直接傳遞到后臺,這樣是不可行的拳恋。原來凡资,get請求的時候,默認是將參數(shù)全部放到了url里面直接以string的形式傳遞的谬运,后臺自然接不到了隙赁。
正確傳參方式:

  $.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;
        }

3、數(shù)組作為參數(shù)
一般get請求不建議將數(shù)組作為參數(shù)梆暖,因為我們知道get請求傳遞參數(shù)的大小是有限制的伞访,最大1024字節(jié),數(shù)組里面內(nèi)容較多時轰驳,將其作為參數(shù)傳遞可能會發(fā)生參數(shù)超限丟失的情況厚掷。
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]勤哗,參數(shù)正常得到抡爹。
為了對比,我將[HttpGet]去掉芒划,然后再調(diào)用

 //[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;
        }

貌似又可行苟鸯,沒有任何問題啊。根據(jù)上面的推論棚点,我們?nèi)サ鬧HttpGet]也是可行的早处,好,我們注釋掉[HttpGet]瘫析,運行起來試試砌梆。
如果這種情況下,再把[HttpGet]注釋掉贬循,數(shù)據(jù)就接收不到了咸包。
最后結論:所有的WebApi方法最好是加上請求的方式([HttpGet]/[HttpPost]/[HttpPut]/[HttpDelete]),不要偷懶杖虾,這樣既能防止類似的錯誤烂瘫,也有利于方法的維護,別人一看就知道這個方法是什么請求奇适。

二坟比、post請求

在WebApi的RESETful風格里面,API服務的增刪改查嚷往,分別對應著http的post/delete/put/get請求葛账。我們下面就來說說post請求參數(shù)的傳遞方式。
1皮仁、基礎類型參數(shù)
(1)傳遞一個參數(shù)
post請求的基礎類型的參數(shù)和get請求有點不一樣籍琳,我們知道get請求的參數(shù)是通過url來傳遞的,而post請求則是通過http的請求體中傳過來的贷祈,WebApi的post請求也需要從http的請求體里面去取參數(shù)趋急。

 $.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取參數(shù)的機制是鍵值對,即某一個key等于某一個value付燥,而這里的FromBody和我們一般通過url取參數(shù)的機制則不同宣谈,它的機制是=value,沒有key的概念键科,并且如果你寫了key(比如你的ajax參數(shù)寫的{NAME:"Jim"})闻丑,后臺反而得到的NAME等于null漩怎。不信你可以試試。
(2)傳遞多個參數(shù)
傳遞多個參數(shù)嗦嗡,使用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;
        }

2、實體作為參數(shù)
(1)單個實體作為參數(shù)
上面我們通過dynamic類型解決了post請求基礎類型數(shù)據(jù)的傳遞問題侥祭,那么當我們需要傳遞一個實體作為參數(shù)該怎么解決呢叁执?

 $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        success: function (data, status) {}
    });
 [HttpPost]
        public bool SaveData(TB_CHARGING oData)
        {
            return true;
        }

上面這種方法是可以的。指定指定contentType為application/json是不是也可以呢

 var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify(postdata),
        success: function (data, status) {}
    });
 [HttpPost]
        public bool SaveData(TB_CHARGING lstCharging)
        {
            return true;
        }

(2)實體和基礎類型一起作為參數(shù)傳遞

var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify({ NAME:"Lilei", Charging:postdata }),
        success: function (data, status) {}
    });
       [HttpPost]
        public object SaveData(dynamic obj)
        {
            var strName = Convert.ToString(obj.NAME);
            var oCharging = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(Convert.ToString(obj.Charging));
            return strName;
        }

3矮冬、數(shù)組作為參數(shù)
(1)基礎類型數(shù)組

    var arr = ["1", "2", "3", "4"];
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify(arr),
        success: function (data, status) { }
    });
[HttpPost]
        public bool SaveData(string[] ids)
        {
            return true;
        }

(2)實體集合

var arr = [
        { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" },
        { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" }
    ];
    $.ajax({
        type: "post",
        url: "http://localhost:27221/api/Charging/SaveData",
        contentType: 'application/json',
        data: JSON.stringify(arr),
        success: function (data, status) {}
    });
[HttpPost]
        public bool SaveData(List<TB_CHARGING> lstCharging)
        {
            return true;
        }

4谈宛、后臺發(fā)送請求參數(shù)的傳遞
都是通過前端的ajax請求去做的,我們知道胎署,如果調(diào)用方不是web項目吆录,比如Android客戶端,可能需要從后臺發(fā)送http請求來調(diào)用我們的接口方法琼牧。

public void TestReques()
    {
         //請求路徑
            string url = "http://localhost:27221/api/Charging/SaveData";

            //定義request并設置request的路徑
            WebRequest request = WebRequest.Create(url);
            request.Method = "post";

            //初始化request參數(shù)
            string postData = "{ ID: \"1\", NAME: \"Jim\", CREATETIME: \"1988-09-11\" }";

            //設置參數(shù)的編碼格式恢筝,解決中文亂碼
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            //設置request的MIME類型及內(nèi)容長度
            request.ContentType = "application/json";
            request.ContentLength = byteArray.Length;

            //打開request字符流
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            //定義response為前面的request響應
            WebResponse response = request.GetResponse();

            //獲取相應的狀態(tài)代碼
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);

            //定義response字符流
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();//讀取所有
            Console.WriteLine(responseFromServer);
    }

三、put請求
WebApi里面put請求一般用于對象的更新巨坊。它和用法和post請求基本相同撬槽。同樣支持[FromBody],同樣可以使用dynamic趾撵。
1侄柔、基礎類型參數(shù)

$.ajax({
        type: "put",
        url: "http://localhost:27221/api/Charging/Update",
        contentType: 'application/json',
        data: JSON.stringify({ ID: "1" }),
        success: function (data, status) {}
    });
[HttpPut]
        public bool Update(dynamic obj )
        {
            return true;
        }

2、實體作為參數(shù)
和post請求相同鼓寺。
四勋拟、delete請求
參數(shù)傳遞機制和post也是基本相同。

var arr = [
        { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },
        { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" },
        { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" }
    ];
    $.ajax({
        type: "delete",
        url: "http://localhost:27221/api/Charging/OptDelete",
        contentType: 'application/json',
        data: JSON.stringify(arr),
        success: function (data, status) {}
    });
 [HttpDelete]
        public bool OptDelete(List<TB_CHARGING> lstChargin)
        {
            return true;
        }

五妈候、總結
以上比較詳細的總結了WebApi各種請求的各種參數(shù)傳遞

參考原文:http://www.w2bc.com/article/117646

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敢靡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子苦银,更是在濱河造成了極大的恐慌啸胧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幔虏,死亡現(xiàn)場離奇詭異纺念,居然都是意外死亡,警方通過查閱死者的電腦和手機想括,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門陷谱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事烟逊≡埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵宪躯,是天一觀的道長乔宿。 經(jīng)常有香客問我,道長访雪,這世上最難降的妖魔是什么详瑞? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮臣缀,結果婚禮上坝橡,老公的妹妹穿的比我還像新娘。我一直安慰自己精置,他們只是感情好驳庭,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氯窍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹲堂。 梳的紋絲不亂的頭發(fā)上狼讨,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音柒竞,去河邊找鬼政供。 笑死,一個胖子當著我的面吹牛朽基,可吹牛的內(nèi)容都是我干的布隔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稼虎,長吁一口氣:“原來是場噩夢啊……” “哼衅檀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霎俩,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤哀军,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后打却,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杉适,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年柳击,在試婚紗的時候發(fā)現(xiàn)自己被綠了猿推。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡捌肴,死狀恐怖蹬叭,靈堂內(nèi)的尸體忽然破棺而出藕咏,到底是詐尸還是另有隱情,我是刑警寧澤具垫,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布侈离,位于F島的核電站,受9級特大地震影響筝蚕,放射性物質(zhì)發(fā)生泄漏卦碾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一起宽、第九天 我趴在偏房一處隱蔽的房頂上張望洲胖。 院中可真熱鬧,春花似錦坯沪、人聲如沸绿映。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叉弦。三九已至,卻和暖如春藻糖,著一層夾襖步出監(jiān)牢的瞬間淹冰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工巨柒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留樱拴,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓洋满,卻偏偏與公主長得像晶乔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子牺勾,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理正罢,服務發(fā)現(xiàn),斷路器禽最,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 多線程腺怯、特別是NSOperation 和 GCD 的內(nèi)部原理。運行時機制的原理和運用場景川无。SDWebImage的原...
    LZM輪回閱讀 2,007評論 0 12
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,196評論 0 7
  • 22年12月更新:個人網(wǎng)站關停呛占,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,180評論 22 257
  • 是無處不在的效率提升器晾虑,用互聯(lián)網(wǎng)去找到行業(yè)的低效點,如同潮水一般沒過企業(yè)各環(huán)節(jié)的效率洼地,幫助企業(yè)實現(xiàn)增效帜篇,轉(zhuǎn)型及...
    Jonvi閱讀 675評論 0 0