C# WebApi傳參之Get請求-AJAX


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

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

   學無止境,精益求精

   在介紹本篇博客之前,先來溫故下AJax的請求,直接上別人的介紹,勿怪。

   如下:

   jquery中的ajax方法參數總是記不住,這里記錄一下。

   1.url
   要求為String類型的參數,(默認為當前頁地址)發送請求的地址。

   2.type
   要求為String類型的參數,請求方式(post或get)默認為get。注意其他http請求方法,例如put和delete也可以使用,但僅部分瀏覽器支持。

   3.timeout
   要求為Number類型的參數,設置請求超時時間(毫秒)。此設置將覆蓋$.ajaxSetup()方法的全局設置。

   4.async
   要求為Boolean類型的參數,默認設置為true,所有請求均為異步請求。如果需要發送同步請求,請將此選項設置為false。注意,同步請求將鎖住瀏覽器,用戶其他操作必須等待請求完成才可以執行。

   5.cache
   要求為Boolean類型的參數,默認為true(當dataType為script時,默認為false),設置為false將不會從瀏覽器緩存中加載請求信息。

   6.data
   要求為Object或String類型的參數,發送到服務器的數據。如果已經不是字符串,將自動轉換為字符串格式。get請求中將附加在url后。防止這種自動轉換,可以查看  processData選項。對象必須為key/value格式,例如{foo1:"bar1",foo2:"bar2"}轉換為&foo1=bar1&foo2=bar2。如果是數組,JQuery將自動為不同值對應同一個名稱。例如{foo:["bar1","bar2"]}轉換為&foo=bar1&foo=bar2。

7.dataType
要求為String類型的參數,預期服務器返回的數據類型。如果不指定,JQuery將自動根據http包mime信息返回responseXML或responseText,並作為回調函數參數傳遞。可用的類型如下:
xml:返回XML文檔,可用JQuery處理。
html:返回純文本HTML信息;包含的script標簽會在插入DOM時執行。
script:返回純文本JavaScript代碼。不會自動緩存結果。除非設置了cache參數。注意在遠程請求時(不在同一個域下),所有post請求都將轉為get請求。
json:返回JSON數據。
jsonp:JSONP格式。使用SONP形式調用函數時,例如myurl?callback=?,JQuery將自動替換后一個“?”為正確的函數名,以執行回調函數。
text:返回純文本字符串。

   8.beforeSend
   要求為Function類型的參數,發送請求前可以修改XMLHttpRequest對象的函數,例如添加自定義HTTP頭。在beforeSend中如果返回false可以取消本次ajax請求。XMLHttpRequest對象是惟一的參數。
            function(XMLHttpRequest){
               this;   //調用本次ajax請求時傳遞的options參數
            }
   9.complete
   要求為Function類型的參數,請求完成后調用的回調函數(請求成功或失敗時均調用)。參數:XMLHttpRequest對象和一個描述成功請求類型的字符串。
          function(XMLHttpRequest, textStatus){
             this;    //調用本次ajax請求時傳遞的options參數
          }

   10.success要求為Function類型的參數,請求成功后調用的回調函數,有兩個參數。
         (1)由服務器返回,並根據dataType參數進行處理后的數據。
         (2)描述狀態的字符串。
         function(data, textStatus){
            //data可能是xmlDoc、jsonObj、html、text等等
            this;  //調用本次ajax請求時傳遞的options參數
         }

   11.error:
   要求為Function類型的參數,請求失敗時被調用的函數。該函數有3個參數,即XMLHttpRequest對象、錯誤信息、捕獲的錯誤對象(可選)。ajax事件函數如下:
       function(XMLHttpRequest, textStatus, errorThrown){
          //通常情況下textStatus和errorThrown只有其中一個包含信息
          this;   //調用本次ajax請求時傳遞的options參數
       }

   12.contentType
   要求為String類型的參數,當發送信息至服務器時,內容編碼類型默認為"application/x-www-form-urlencoded"。該默認值適合大多數應用場合。

  13.dataFilter
  要求為Function類型的參數,給Ajax返回的原始數據進行預處理的函數。提供data和type兩個參數。data是Ajax返回的原始數據,type是調用jQuery.ajax時提供的dataType參數。函數返回的值將由jQuery進一步處理。
            function(data, type){
                //返回處理后的數據
                return data;
            }

   14.dataFilter
   要求為Function類型的參數,給Ajax返回的原始數據進行預處理的函數。提供data和type兩個參數。data是Ajax返回的原始數據,type是調用jQuery.ajax時提供的dataType參數。函數返回的值將由jQuery進一步處理。
            function(data, type){
                //返回處理后的數據
                return data;
            }

   15.global
   要求為Boolean類型的參數,默認為true。表示是否觸發全局ajax事件。設置為false將不會觸發全局ajax事件,ajaxStart或ajaxStop可用於控制各種ajax事件。

   16.ifModified
   要求為Boolean類型的參數,默認為false。僅在服務器數據改變時獲取新數據。服務器數據改變判斷的依據是Last-Modified頭信息。默認值是false,即忽略頭信息。

   17.jsonp
   要求為String類型的參數,在一個jsonp請求中重寫回調函數的名字。該值用來替代在"callback=?"這種GET或POST請求中URL參數里的"callback"部分,例如{jsonp:'onJsonPLoad'}會導致將"onJsonPLoad=?"傳給服務器。

   18.username
   要求為String類型的參數,用於響應HTTP訪問認證請求的用戶名。

   19.password
   要求為String類型的參數,用於響應HTTP訪問認證請求的密碼。

   20.processData
   要求為Boolean類型的參數,默認為true。默認情況下,發送的數據將被轉換為對象(從技術角度來講並非字符串)以配合默認內容類型"application/x-www-form-urlencoded"。如果要發送DOM樹信息或者其他不希望轉換的信息,請設置為false。

   21.scriptCharset
   要求為String類型的參數,只有當請求時dataType為"jsonp"或者"script",並且type是GET時才會用於強制修改字符集(charset)。通常在本地和遠程的內容編碼不同時使用。

   以上便是Ajax請求各參數介紹

   下面開始咱們的AJax請求之Get方式

   Get請求就是通過URL地址進行的請求,其有如下特點:

   1、Get請求的安全性不如Post

   2、Get請求允許傳遞的數據量為1024字節,因此:不宜傳遞過多數據,否則會超出限制

   3、Get請求時,將各個參數浮在URL之后進行請求,也就是將數據放在Http協議頭中

   下面來簡單介紹下幾種不同的Get請求

   1、不傳遞參數的Get請求

   2、傳遞一個參數的Get請求

   3、傳遞多個參數的Get請求

   4、傳遞一個實體的Get請求

   在進行之前,先來做下准備工作(本案例並沒有做到真正的數據持久化,僅僅為簡單模擬而已):

   首先建一個Person類,如下:

 public class Person
    {
        private int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        private int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private string sex;

        public string Sex
        {
            get { return sex; }
            set { sex = value; }
        }

    }

   很簡單,不多說。

   另一個ResultToJson類,如下:<我之前的博客中有專門描述,請參照我的博客:C# web api 返回類型設置為json的兩種方法>

   如下:

 public class ResultToJson
    {
        public static HttpResponseMessage toJson(Object obj)
        {
            String str;
            if (obj is String || obj is Char)
            {
                str = obj.ToString();
            }
            else
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                str = serializer.Serialize(obj);
            }
            HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
            return result;
        } 
    }

   最后一個就是JsonHelper類,這個大家可參考我之前的博客:C#處理JSON數據

   至此:准備工作准備完畢

   新建一個WebApi控制器如下:

 public class PersonController : ApiController
    {
        List<Person> list = new List<Person>();
        /// <summary>
        /// 初始化數據
        /// </summary>
        public PersonController()
        {
            for (int i = 0; i < 100; i++)
            {
                Person P = new Person()
                {
                    Id = i,
                    Name = "Name" + i,
                    Age = i,
                    Sex = i % 2 == 0 ? "M" : "W"
                };
                list.Add(P);
            }
        }
     }

   1、不傳參數的Get請求如下:

        /// <summary>
        /// 簡單測試案例
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get()
        {
            return "OK";
        }
//無參數請求-簡單示例
        $(document).ready(function () {
            $.ajax({
                url: "http://localhost:9953/api/Person/Get",
                type: "get",
                contentType: "application/json",
                dataType: "text",
                data:{},
                success: function (result,status) {
                    if (status == "success") {
                        alert(result);
                    }
                },
                error: function (error) {
                    alert(error);
                }
            });
        });

   2、傳遞一個參數的案例如下:

        /// <summary>
        /// 通過id獲取特定數據
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        [HttpGet]
        public string GetById(int Id)
        {
            list = list.Where(p => p.Id == Id).ToList();
            return JsonHelper.JsonSerializer<List<Person>>(list);
        }
 //單個參數傳遞
        $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetById",
                type: "get",
                dataType: "text",
                data: {Id:"3"},
                success: function (result,status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });

   有興趣的小虎斑們也可以嘗試URL傳參的方法:<把請求的data去掉,URL后面加上傳遞的參數>

 //單個參數傳遞
        $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetById?Id=3",
                type: "get",
                dataType: "text",
                success: function (result,status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });

   3、傳遞多個參數如下:

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

   當然,有興趣的小虎斑也可以將參數放在URL后面進行測試,在此不作說明!

   4、傳遞一個實體

        /// <summary>
        /// 對象作為參數
        /// </summary>
        /// <param name="P"></param>
        /// <returns></returns>
        [HttpGet]
        public HttpResponseMessage GetByObject([FromUri]Person P)
        {
            return ResultToJson.toJson(P);
        }
        //傳遞一個對象該如何?
        $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetByObject",
                type: "get",
                dataType: "text",
                data: { Id: "8888",Sex:"",Name:"陳卧龍",Age:"26" },
                success: function (result, status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });

   大家可能發現傳遞實體時,代碼和上述有點不同,GetByObject([FromUri]Person P)加了一個[FromUri]。如果不加上這個關鍵詞的話,那么則會傳遞實體失敗,究其原因如下:

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

   如果大家不加上[FromUri]關鍵字,Get請求時URL會被解析為:http://localhost:9953/api/Person/GetByObject?Id=8888&Sex=男&Name=陳卧龍&Age=26,當被解析成這種格式后,Net后端的webApi是無法解析成實體對象的。因此,在傳遞一個對象時,我們有必要加上[FromUri]關鍵字。

   其實:在所有的Get請求時,我建議大家都加上[FromUri]關鍵字,這樣就不會引發諸如上述的問題。再說了,養成一個好的習慣不是挺好的么?

   @陳卧龍的博客

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM