WebApi系列~通過HttpClient來調用Web Api接(jie)口
HttpClient是(shi)一個被封(feng)裝好的(de)(de)(de)(de)類,主要(yao)用(yong)于Http的(de)(de)(de)(de)通訊,它在.net,java,oc中都(dou)有被實(shi)現,當然,我只會(hui).net,所以(yi),只講.net中的(de)(de)(de)(de)HttpClient去調用(yong)Web Api的(de)(de)(de)(de)方法,基(ji)于api項目的(de)(de)(de)(de)特殊性,它需要(yao)有一個完全(quan)安(an)(an)全(quan)的(de)(de)(de)(de)環境(jing),所以(yi),你的(de)(de)(de)(de)api控制器看起來有點(dian)特別,只有5個方法,而且都(dou)是(shi)標準的(de)(de)(de)(de)http方法,我覺得這(zhe)種設計很(hen)不錯,很(hen)清晰,而且為了實(shi)現安(an)(an)全(quan)性,它不支持使用(yong)傳統的(de)(de)(de)(de)表單數據,取而代之的(de)(de)(de)(de)是(shi)FromBody參數,它指拿HttpRequestMessage里參數,而不是(shi)所有的(de)(de)(de)(de)Request數據,這(zhe)是(shi)基(ji)于安(an)(an)全(quan)方面(mian)的(de)(de)(de)(de)考慮。
一 Api接口參數的標準(zhun)性
Get方式,可以有多個重載,有多個參數
POST方式,只能有(you)(you)一個參數,并且用[FromBody]約(yue)束,如(ru)果有(you)(you)多個參數,需要以對象的方式進行傳遞
Put方(fang)式,只能有(you)兩(liang)個(ge)(ge)參(can)數,其中一個(ge)(ge)是(shi)通(tong)過Request.QueryString方(fang)式進行傳遞的,作為(wei)要(yao)更新(xin)對(dui)象的主鍵,別一個(ge)(ge)是(shi)[FromBody]字段(duan),也是(shi)一個(ge)(ge)字段(duan),如果(guo)多個(ge)(ge)字段(duan)需要(yao)把它封裝成對(dui)象
標準接口如圖
二 調用方,參數的標(biao)準性
在客戶端(duan)進(jin)行接口(kou)調用時,我們以(yi)網(wang)頁(ye)端(duan)為例(li),看一(yi)下網(wang)頁(ye)端(duan)進(jin)行ajax跨域請求的代碼(ma)
Get方式
$.ajax({ url: "//localhost:52824/api/register", type: "GET", success: function (data) { console.log("json:" + data); } });
Post方式
$.ajax({ url: "//localhost:52824/api/register", type: "POST", data: { '': '1' },//這里(li)鍵名稱(cheng)必須(xu)為空,多個(ge)參(can)數(shu)請傳對象(xiang),api端(duan)參(can)數(shu)名必須(xu)為value success: function (data) { console.log("post:" + data); } });
三(san) 在控制(zhi)臺中實(shi)現Get方式(shi)獲(huo)取(qu)接口(kou)數據(ju)(只有異步(bu)實(shi)現)
/// <summary> /// HttpClient實現Get請(qing)求 /// </summary> static async void dooGet() { string url = "//localhost:52824/api/register?id=1&leval=5"; //創建HttpClient(注意傳入HttpClientHandler) var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; using (var http = new HttpClient(handler)) { //await異步等待(dai)回(hui)應 var response = await http.GetAsync(url); //確(que)保(bao)HTTP成(cheng)功(gong)狀態值(zhi) response.EnsureSuccessStatusCode(); //await異步讀取最后的JSON(注意此時(shi)gzip已(yi)經被自動解壓縮了,因為上面(mian)的AutomaticDecompression = DecompressionMethods.GZip) Console.WriteLine(await response.Content.ReadAsStringAsync()); } }
四 在控制臺中實(shi)現Post方式提交數(shu)據(只有異步實(shi)現)
/// <summary> /// HttpClient實現Post請求 /// </summary> static async void dooPost() { string url = "//localhost:52824/api/register"; var userId = "1"; //設(she)置HttpClientHandler的AutomaticDecompression var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; //創建HttpClient(注意傳入HttpClientHandler) using (var http = new HttpClient(handler)) { //使(shi)用FormUrlEncodedContent做HttpContent var content = new FormUrlEncodedContent(new Dictionary<string, string>() { {"", userId}//鍵名必須為空 }); //await異步等(deng)待回應 var response = await http.PostAsync(url, content); //確保(bao)HTTP成(cheng)功狀態值(zhi) response.EnsureSuccessStatusCode(); //await異步讀取最后的(de)JSON(注意此時(shi)gzip已經被(bei)自動解壓縮了,因為上面的(de)AutomaticDecompression = DecompressionMethods.GZip) Console.WriteLine(await response.Content.ReadAsStringAsync()); } }
五 在控制臺中實(shi)現Put方式提交數據(ju)(只有(you)異(yi)步實(shi)現)
/// <summary> /// HttpClient實現Put請(qing)求 /// </summary> static async void dooPut() { string url = "//localhost:52824/api/register?userid=" + userId; var userId = "1"; //設置HttpClientHandler的AutomaticDecompression var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; //創建(jian)HttpClient(注(zhu)意(yi)傳(chuan)入HttpClientHandler) using (var http = new HttpClient(handler)) { //使用FormUrlEncodedContent做(zuo)HttpContent var content = new FormUrlEncodedContent(new Dictionary<string, string>() { {"", "數據"}//鍵名必須為(wei)空 }); //await異步(bu)等(deng)待回應 var response = await http.PutAsync(url, content); //確(que)保HTTP成(cheng)功狀態值 response.EnsureSuccessStatusCode(); //await異步讀取(qu)最后(hou)的JSON(注意此時gzip已(yi)經被自動(dong)解壓縮了,因為(wei)上(shang)面的AutomaticDecompression = DecompressionMethods.GZip) Console.WriteLine(await response.Content.ReadAsStringAsync()); } }
OK,到這里,我們的(de)(de)(de)(de)客戶端(duan)如(ru)何去調用web api就講(jiang)完了,事實上,手(shou)機端(duan),平板端(duan)也是(shi)相關的(de)(de)(de)(de)方(fang)式去調用的(de)(de)(de)(de),它(ta)們也都有(you)自己的(de)(de)(de)(de)HttpClient類,大同(tong)小異!