中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

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)小異!

 回到目錄

posted @ 2014-10-23 11:55  張占嶺  閱讀(76838)  評論(21)    收藏  舉報