HttpClient介紹


使用RestSharp 庫消費Restful Service 中介紹了一個開源的Http Client庫RestSharp。在ASP.NET MVC 4中也帶來.NET框架中的Http Client。它提供了一個靈活的、可擴展的API來訪問一切通過HTTP公開的RESTful服務。HttpClient是ASP.NET Web API 的一部分,直接包含在.NET 4.5中,也可以單獨安裝ASP.NET MVC4,可以通過Nuget包獲取,包里面包含以下3部分:

  • System.Net.Http: The main NuGet package providing the basic HttpClient and related classes
  • System.Net.Http.Formatting: Adds support for serialization, deserialization as well as for many additional features building on top of System.Net.Http
  • System.Json: Adds support for JsonVaue which is a mechanism for reading and manipulating JSON documents

HttpClient是接收HttpResponseMessages和發送HttpRequestMessages的主要類,如果你習慣了使用WebClient或者是HttpWebRequest, 需要注意HttpClient和他們不同的地方:

1、在HttpClient實例上配置擴展,設置默認的頭部,取消未完成的請求和更多的設置。

2、你通過一個單一的HttpClient實例,它有自己的連接池。

3、HttpClients不與特定的HTTP服務器綁定,你可以使用相同的HttpClient實例提交任何HTTP請求。

4、你可以用HttpClient為特定的站點創建特殊的Client

5、HttpClient采用新的型模式處理異步請求使它更容易管理和協調更多的請求。

下面我們看下具體的代碼, MSDN code gallery 有個很詳細Get操作的示例,這個示例是向World Bank Data Web API 發送一個Get請求,獲取到Json格式的數據

namespace WorldBankSample 

    /// <summary> 
    /// Sample download list of countries from the World Bank Data sources at http://data.worldbank.org/ 
    /// </summary> 
    class Program 
    { 
        static string _address = "http://api.worldbank.org/countries?format=json"; 
 
        static void Main(string[] args) 
        { 
            // Create an HttpClient instance 
            HttpClient client = new HttpClient(); 
 
            // Send a request asynchronously continue when complete 
            client.GetAsync(_address).ContinueWith( 
                (requestTask) => 
                { 
                    // Get HTTP response from completed task. 
                    HttpResponseMessage response = requestTask.Result; 
 
                    // Check that response was successful or throw exception 
                    response.EnsureSuccessStatusCode(); 
 
                    // Read response asynchronously as JsonValue and write out top facts for each country 
                    response.Content.ReadAsAsync<JsonArray>().ContinueWith( 
                        (readTask) => 
                        { 
                            Console.WriteLine("First 50 countries listed by The World Bank..."); 
                            foreach (var country in readTask.Result[1]) 
                            { 
                                Console.WriteLine("   {0}, Country Code: {1}, Capital: {2}, Latitude: {3}, Longitude: {4}", 
                                    country.Value["name"], 
                                    country.Value["iso2Code"], 
                                    country.Value["capitalCity"], 
                                    country.Value["latitude"], 
                                    country.Value["longitude"]); 
                            } 
                        }); 
                }); 
 
            Console.WriteLine("Hit ENTER to exit..."); 
            Console.ReadLine(); 
        } 
    } 

下面介紹一個發送Post 請求的示例,示例代碼使用默認創建的ASP.NET Web API模板項目:

public class ValuesController : ApiController
   {
       // GET /api/values
       public IEnumerable<string> Get()
       {
           return new string[] { "value1", "value2" };
       }

       // GET /api/values/5
       public string Get(int id)
       {
           return "value";
       }

       // POST /api/values
       public string Post(string value)
       {
           return value;
       }

       // PUT /api/values/5
       public void Put(int id, string value)
       {
       }

       // DELETE /api/values/5
       public void Delete(int id)
       {
       }
   }

使用HttpClient示例的代碼如下:

          string serviceAddress = "http://localhost:2650/api/values";
           HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceAddress);
           request.Method = "POST";
           request.ContentType = "application/json";
           string strContent = @"{ ""value"": ""test""}" ;
           using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream()))
           {
               dataStream.Write(strContent);
               dataStream.Close();
           }
           HttpWebResponse response = (HttpWebResponse)request.GetResponse();
           using (StreamReader dataStream = new StreamReader(response.GetResponseStream()))
           {
               var result = dataStream.ReadToEnd();
               Console.WriteLine(result);
           }

            Uri serviceReq = new Uri(serviceAddress);
            HttpClient client = new HttpClient();
            HttpContent content = new StringContent(@"{ ""value"": ""test""}");
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            // Send a request asynchronously continue when complete
            client.PostAsync(serviceReq, content).ContinueWith(
                (requestTask) =>
                {
                    // Get HTTP response from completed task.
                    HttpResponseMessage response = requestTask.Result;

                    // Check that response was successful or throw exception
                    response.EnsureSuccessStatusCode();

                    // Read response asynchronously as JsonValue and write out top facts for each country
                    response.Content.ReadAsAsync<string>().ContinueWith(
                        (readTask) =>
                        {
                            Console.WriteLine(readTask.Result);

                        });
                });

上面代碼首先是創建一個HttpClient實例,設置要Post的數據的格式,然后調用HttpClient的異步請求,獲取到的是一個HttpResponseMessage實例,可以在這個實例中檢查請求的狀態,調用的是一個擴展方法EnsureSuccessStatusCode,如果不是HttpStatusCode.OK,就會拋出一個異常。通過HttpResponseMessage的Content屬性獲取HttpContent,HttpContent有一些方法輔助處理接收的內容。

對應於使用HttpWebRequest的示例如下:

          string serviceAddress = "http://localhost:2650/api/values";
           HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceAddress);
           request.Method = "POST";
           request.ContentType = "application/json";
           string strContent = @"{ ""value"": ""test""}" ;
           using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream()))
           {
               dataStream.Write(strContent);
               dataStream.Close();
           }
           HttpWebResponse response = (HttpWebResponse)request.GetResponse();
           using (StreamReader dataStream = new StreamReader(response.GetResponseStream()))
           {
               var result = dataStream.ReadToEnd();
               Console.WriteLine(result);
           }

上面是通過代碼發送的Http請求,也可以用Fiddlers來驗證請求,例如:

image

image


免責聲明!

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



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