最近使用winform对webapi进行测试,搜集到园友的文章,记录下来供后续参考。
第一篇文章,原文地址http://www.cnblogs.com/Johnny_Z/archive/2012/02/12/2348286.html
代码 using System.Net; using System.IO; //创建HttpWebRequest对象 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://192.168.0.1");//目标主机ip地址 //模拟POST的数据 string postData = string.Empty; postData += "user=" + "test1"; postData += "&password=" + "123"; Encoding utf8=Encoding.UTF8; byte[] data = utf8.GetBytes(postData); //设置请求头信息 string cookieheader = string.Empty; CookieContainer cookieCon = new CookieContainer(); request.Method = "POST"; //设置cookie,若没有可以不设置 request.CookieContainer = cookieCon; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; Stream newStream = request.GetRequestStream(); //把请求数据 写入请求流中 newStream.Write(data, 0, data.Length); newStream.Close(); //获得HttpWebResponse对象 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Console.Write("Content length is {0}", response.ContentLength + "\r\n"); Console.Write("Content type is {0}", response.ContentType + "\r\n"); //获得响应流 Stream receiveStream = response.GetResponseStream(); StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); //输入响应流信息 Console.Write("Response stream received.\r\n"); Console.Write(readStream.ReadToEnd() + "\r\n"); response.Close(); receiveStream.Close(); readStream.Close();
第二篇文章http://www.cnblogs.com/shanyou/archive/2012/03/21/2410739.html
使用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); }
第三篇文章,模拟post登录http://www.cnblogs.com/shanyou/archive/2012/03/21/2410739.html