1. 程式人生 > >WebApi介面傳參呼叫問題

WebApi介面傳參呼叫問題

原創地址點選開啟連結

一、get請求

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

1、基礎型別引數

[csharp]  view plain  copy
  1. [HttpGet]  
  2. public string GetAllChargingData(int id, string name)  
  3. {  
  4.     return
     "ChargingData" + id;  
  5. }  
[javascript]  view plain  copy
  1. $.ajax({  
  2.         type: "get",  
  3.         url: "http://localhost:27221/api/Charging/GetAllChargingData"
    ,  
  4.         data: { id: 1, name: "Jim", bir: "1988-09-11"},  
  5.         success: function (data, status) {  
  6.             if
     (status == "success") {  
  7.                 $("#div_test").html(data);  
  8.             }  
  9.         }  
  10.     });  
 這是get請求最基礎的引數傳遞方式,沒什麼特別好說的。

2、實體作為引數

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

[csharp]  view plain  copy
  1. public class TB_CHARGING  
  2.     {  
  3.         /// <summary>  
  4.         /// 主鍵Id  
  5.         /// </summary>  
  6.         public string ID { getset; }  
  7.   
  8.         /// <summary>  
  9.         /// 充電裝置名稱  
  10.         /// </summary>  
  11.         public string NAME { getset; }  
  12.   
  13.         /// <summary>  
  14.         /// 充電裝置描述  
  15.         /// </summary>  
  16.         public string DES { getset; }  
  17.   
  18.         /// <summary>  
  19.         /// 建立時間  
  20.         /// </summary>  
  21.         public DateTime CREATETIME { getset; }  
  22.     }  
[csharp]  view plain  copy
  1. [HttpGet]  
  2. public string GetByModel(TB_CHARGING oData)  
  3. {  
  4.      return "ChargingData" + oData.ID;  
  5. }  
[javascript]  view plain  copy
  1. $.ajax({  
  2.         type: "get",  
  3.         url: "http://localhost:27221/api/Charging/GetByModel",  
  4.         contentType: "application/json",  
  5.         data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },  
  6.         success: function (data, status) {  
  7.             if (status == "success") {  
  8.                 $("#div_test").html(data);  
  9.             }  
  10.         }  
  11.     });  

測試結果: 在get請求時,我們直接將json物件當做實體傳遞後臺,後臺是接收不到的。這是為什麼呢?我們來看看對應的http請求


[html]  view plain  copy
  1. <img src="http://images2015.cnblogs.com/blog/459756/201603/459756-20160331104121410-719598113.png" alt="" />  

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

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

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

[javascript]  view plain  copy
  1. var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };  
  2.     $.ajax({  
  3.         type: "get",  
  4.         url: "http://localhost:27221/api/Charging/GetAllChargingData",  
  5.         data: postdata,  
  6.         success: function (data, status) { }  
  7.     });  
[csharp]  view plain  copy
  1. [HttpGet]  
  2.         public string GetAllChargingData([FromUri]TB_CHARGING obj)  
  3.         {  
  4.             return "ChargingData" + obj.ID;  
  5.         }  

得到結果:

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

[javascript]  view plain  copy
  1. $.ajax({  
  2.         type: "get",  
  3.         url: "http://localhost:27221/api/Charging/GetByModel",  
  4.         contentType: "application/json",  
  5.         data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },  
  6.         success: function (data, status) {  
  7.             if (status == "success") {  
  8.                 $("#div_test").html(data);  
  9.             }  
  10.         }  
  11.     });  
[csharp]  view plain  copy
  1. [HttpGet]  
  2.         public string GetByModel(string strQuery)  
  3.         {  
  4.             TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);  
  5.             return "ChargingData" + oData.ID;  
  6.         }  

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

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

3、陣列作為引數

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

4、“怪異”的get請求

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

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

相關推薦

WebApi介面呼叫問題

原創地址點選開啟連結 一、get請求 對於取資料,我們使用最多的應該就是get請求了吧。下面通過幾個示例看看我們的get請求引數傳遞。 1、基礎型別引數 [csharp]  view plain  copy

通過反射呼叫視窗

直接呼叫    string strName = "MyOpsTools." + "stringFormName";//要呼叫窗體的 程式集.+窗體名稱 (要有.) string assemblyPath = "程式集名稱的長格式"; Form form = (Form)

介面時,不寫欄位,這種格式http://localhost:9000/findData/1 取

@GetMapping("/findData/{id}") public List<DetectionVo> findData(@PathVariable("id") String id){ //return userService.findData();

VUE介面方式

傳遞引數有兩種方式: 由 taskList.vue 點選view按鈕 跳轉至taskviewIndex;1、push  name+params;this.$router.push({name

介面

@Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); if(mListe

java 通過儲存過程名字 獲取儲存過程的引數列表,然後自動呼叫sp

實現思路:關鍵點在 通過儲存過程的名字獲取引數列表 資料庫選擇sql server 2012 查詢的指令碼是(注意要指定對應的資料庫,如:使用 use test  或者 test.sys.parameters   test.dbo.sysobjects): select

vue-resource jsonp介面-json

很多vue前臺開發,希望以json的形式來傳遞引數,使用方法如下: //通過json傳參 var url="http://localhost/jsonparam"; var sendData={"configid":55 ,"config

如何呼叫http介面通過get()/post()方法

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.

【轉】C#進階系列——WebApi 介面引數不再困惑:詳解

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

HttpUrlconnection POST提交 用於介面呼叫

package com.jr.demo; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.

WebApi 介面引數不再困惑:詳解

get和post請求的區別:1、GET使用URL或者cookie傳參,而POST 將資料放在body中2、GET的URL會有長度的限制,一般為1024,而POST的資料可以非常大3、Post比GET更安全,因為資料在位址列不可見4、GET用於獲取資料,而Post用於修改資料

C#進階系列——WebApi 介面引數不再困惑:詳解

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

Angular 呼叫 WebApi

WebApi的CURD方法記錄以及呼叫傳參 // GET api/test public IEnumerable<string> Get() { return new string[] { "

WebApi 接口數不再困惑:詳解

gin ebr 字符流 sts ash nbsp 之前 ret 傳遞對象 轉自:http://www.cnblogs.com/landeanfen/p/5337072.html 閱讀目錄 一、get請求 1、基礎類型參數 2、實體作為參數 3、數組作為

C#進階系列——WebApi 接口數不再困惑:詳解

pub 博客 bapi write ids 簡單 指定 數組 這也 https://www.cnblogs.com/landeanfen/p/5337072.html 閱讀目錄 一、get請求 1、基礎類型參數 2、實體作為參數 3、數組作為參數 4

微信小程式——父子元件以及方法的呼叫

父元件向子元件傳參 A元件為父元件,B元件為子元件,以下是A元件向B元件傳參 在A元件中引入B元件(父元件引入子元件) 在A元件的json中寫入(父元件): { "component": true, "usingComponents": { "com

MySql儲存過程中和不以及java中呼叫程式碼

資料庫表結構 1.mysql不傳參寫儲存過程 create procedure product() -- product為儲存過程名稱 begin select * from book; end 呼叫此儲存過程為 CALL product

C++構造的優化和討論構造拷貝構造N中呼叫情況

C++對傳參和傳返回值時建構函式的優化處理 1.c++形式引數型別和返回值為引用時,會把實參或者返回值引用自動賦給形式引數(返回值)。 2.c++返回值賦值和返回值使用一般會進行編譯器的優化。 3.c++函式引數(或者返回值)賦值時,如果其型別是類並且對應

struts2動態方法呼叫與j2ee互動

動態方法呼叫: (action程式碼) package com.zking.web; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ModelDriven; import

WebApi中Post請求時後端的接收方式

1.單引數 [FromBody]+變數方式(不推薦):如public string PostUser([FromBody] string user_id){} 由於我們的前端習慣用key/value的方式進行請求,而此法要求key為空,有點不三不四,程式碼不規範,故此不推薦。總不能都是你寫的