HttpClient介绍

时间:2022-04-23
本文章向大家介绍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来验证请求,例如: