最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。
十年河東十年河西,莫欺少年窮。
學無止境,精益求精
在介紹本篇博客之前,先來溫故下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]關鍵字,這樣就不會引發諸如上述的問題。再說了,養成一個好的習慣不是挺好的么?
@陳卧龍的博客
