HttpClient + ASP.NET Web API(附加WebClient HttpWebRequest JQuery AJAX请求方式)
2015-01-29 18:28
585 查看
还没有学习WCF,先学习了ASP.NET WebAPI,感觉REST风格的WebAPI非常简单,而且WebAPI框架同时使用了Web标准规范,比如HTTP、XML、JSON等,而且它和MVC很像,都使用了一些相同的核心概念,如路由、控制器等。WebAPI可以智能判断请求的格式 XML或者JSON 返回相应的格式,基于HTTP非常轻便。,下面说一下如何创建WebAPI项目:
1. 根据截图创建一个WebAPI项目
以上两部就是创建一个WebAPI项目,不过不是空的,如果想创建一个空的项目,可以按照WebAPI官网上的教程来做。
2. 新建一个Controller继承APIController
3. 编译后发布,就可以测试了
在浏览器里面输入http://localhost/api/Test/Friday,会看到如下结果,到这里就说明WebAPI发布成功了
下面讲一下HttpClient远程调用访问
首先讲一下HttpClient类, HttpClient是web4.5才出现的,之前大家可能都用 HttpWebRequest或者WebClient 对吧。
System.Net.Http.HttpClient 类用于通过 HTTP 发送和接收基本请求。它提供了一个用于从 URI 所标识的资源发送 HTTP 请求和接收 HTTP 响应的基类。
该类可用来向 Web 服务发送 GET、PUT、POST、DELETE 以及其他请求。上述每种请求都作为异步操作进行发送。
System.Net.Http.HttpResponseMessage 类用于声明从 HTTP 请求接收到的 HTTP 响应消息。HTTP 消息由 IETF 在 RFC 2616 中进行定义。
System.Net.Http.HttpContent 类是用于声明 HTTP 实体正文和内容标题的基类。 在这种情况下,System.Net.Http.Http.Content 用于声明 HTTP 响应。
看下POST请求:
再看下GET请求:
再看下WebClient方式:
再看下HttpWebRequest方式:
附加上JQuery AJAX请求(AJAX没有经过测试):
不知道你有没有感觉到WebAPI的简单强大,这就是REST 就是这么简单,HttpClient+WebAPI和WCF对比真的是水果刀与牛刀,另外我也参考了dudu的博客,
OK,先写到这里,有什么问题或者建议请给我留言
1. 根据截图创建一个WebAPI项目
以上两部就是创建一个WebAPI项目,不过不是空的,如果想创建一个空的项目,可以按照WebAPI官网上的教程来做。
2. 新建一个Controller继承APIController
public class TestController : ApiController { [HttpGet] public List<Menus> Friday() { return new List<Menus>() { new Menus{ID=1, isnode="123", menuname="Ceshi测试", orderid=3, parentid=12, remark="标记1", url="2222"}, new Menus{ID=2, isnode="456", menuname="测试123", orderid=1, parentid=12, remark="标记2", url="2222"}, new Menus{ID=3, isnode="789", menuname="测试", orderid=2, parentid=12, remark="标记3", url="2222"}, }; } [HttpPost] public List<Menus> Monday(int id, int ui) { return new List<Menus>() { new Menus{ID=1, isnode="123", menuname="Ceshi测试", orderid=3, parentid=12, remark="标记1", url="2222"}, new Menus{ID=2, isnode="456", menuname="测试123", orderid=1, parentid=12, remark="标记2", url="2222"}, new Menus{ID=3, isnode="789", menuname="测试", orderid=2, parentid=12, remark="标记3", url="2222"}, }; } }
3. 编译后发布,就可以测试了
在浏览器里面输入http://localhost/api/Test/Friday,会看到如下结果,到这里就说明WebAPI发布成功了
<ArrayOfMenus xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MvcWebAPI"> <Menus> <ID>1</ID> <isShow>0</isShow> <isnode>123</isnode> <location>999</location> <menuname>Ceshi测试</menuname> <orderid>3</orderid> <parentid>12</parentid> <remark>标记1</remark> <url>2222</url> </Menus> 。。。。。。。。。省略了 </ArrayOfMenus>
下面讲一下HttpClient远程调用访问
首先讲一下HttpClient类, HttpClient是web4.5才出现的,之前大家可能都用 HttpWebRequest或者WebClient 对吧。
System.Net.Http.HttpClient 类用于通过 HTTP 发送和接收基本请求。它提供了一个用于从 URI 所标识的资源发送 HTTP 请求和接收 HTTP 响应的基类。
该类可用来向 Web 服务发送 GET、PUT、POST、DELETE 以及其他请求。上述每种请求都作为异步操作进行发送。
System.Net.Http.HttpResponseMessage 类用于声明从 HTTP 请求接收到的 HTTP 响应消息。HTTP 消息由 IETF 在 RFC 2616 中进行定义。
System.Net.Http.HttpContent 类是用于声明 HTTP 实体正文和内容标题的基类。 在这种情况下,System.Net.Http.Http.Content 用于声明 HTTP 响应。
看下POST请求:
public async void TestHttpClientPost() { //以JSON格式传递请求参数 var requestJson = JsonConvert.SerializeObject(new { id = 1, ui = 2}); //然后用System.Net.Http.StringContent把它打个包 HttpContent httpContent = new StringContent(requestJson); //然后设置一下ContentType,如果是xml,那么API就返回XML格式的内容(灰常智能) httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); HttpClientHandler handler = new HttpClientHandler(); //自动解压缩HTTP回应的GZIP压缩内容 handler.AutomaticDecompression = System.Net.DecompressionMethods.GZip; HttpClient httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.PostAsync("http://localhost/api/Test/Friday", httpContent); //确保返回成功,否则抛出异常 response.EnsureSuccessStatusCode(); //我这里的if判断多此一举,可以忽略 if(response.IsSuccessStatusCode) { string str = await response.Content.ReadAsStringAsync(); var menus = JsonConvert.DeserializeObject<IList<Menus>>(str); menus.ToList().ForEach(x=>Console.WriteLine(x.ID + "---" + x.menuname)); } }
再看下GET请求:
public async void TestHttpClient() { HttpClient httpClient = new HttpClient(); try { //限制服务器响应的数据量(没必要设置) httpClient.MaxResponseContentBufferSize = 256000; //设置代理头(某些Web服务器要求这样做 否则就出错) //Mozilla是Netscape的吉祥物,也是Netscape Navigator浏览器使用的内部开发代号。 //由于Netscape早期的影响力,直到今天,所有浏览器包括IE,向Web服务器报告自己的浏览器标识的时候, //都以 “Mozilla”开头,表明自己是Mozilla兼容的。 httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); //发送异步Get请求 HttpResponseMessage responseMessage = await httpClient.GetAsync("http://localhost/api/Menus"); //这句话用来确定已经正确返回 否则抛出异常 responseMessage.EnsureSuccessStatusCode(); string str = await responseMessage.Content.ReadAsStringAsync(); } catch(Exception ex) { } }
再看下WebClient方式:
public void TestWebClient() { WebClient webClient = new WebClient(); webClient.DownloadStringAsync(new Uri("http://localhost/api/Test/Friday")); webClient.DownloadStringCompleted += webClient_DownloadStringCompleted; } void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { if (e.Error != null) { Console.WriteLine("抛出异常:" + e.Error.ToString()); } else { string str = e.Result.Trim(); } }
再看下HttpWebRequest方式:
<span style="white-space:pre"> </span>public void TestHttpWebRequest() { HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost/api/Test/Friday"); webRequest.Method = "GET"; //注释掉的是使用POST方式 //webRequest.ContentType = "application/json"; //using(StreamWriter strWriter = new StreamWriter(webRequest.GetRequestStream())) //{ // strWriter.Write("参数"); // strWriter.Close(); //} HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); using(StreamReader strReader = new StreamReader(webResponse.GetResponseStream())) { var result = strReader.ReadToEnd(); Console.WriteLine(result); } }
附加上JQuery AJAX请求(AJAX没有经过测试):
var requestJson = JSON.stringify({ startId: 1, itemcount: 3 }); $.ajax({ url: '/api/demo/sitelist', data: requestJson, type: "post", dataType: "json", contentType: "application/json; charset=utf8", success: function (data) { jQuery.each(data, function (i, val) { $("#result").append(val.Title + ': ' + val.Uri +'<br/>'); }); } });
不知道你有没有感觉到WebAPI的简单强大,这就是REST 就是这么简单,HttpClient+WebAPI和WCF对比真的是水果刀与牛刀,另外我也参考了dudu的博客,
OK,先写到这里,有什么问题或者建议请给我留言
相关文章推荐
- 通过HttpClient 调用ASP.NET Web API
- 【ASP.NET Web API教程】3.4 HttpClient消息处理器
- 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)
- ASP.NET MVC Web API 学习笔记----HttpClient简介
- 通过HttpClient 调用ASP.NET Web API
- HttpClient + ASP.NET Web API, WCF之外的另一个选择
- 通过HttpClient 调用ASP.NET Web API
- asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端
- 通过HttpClient 调用ASP.NET Web API
- Asp.Net Web API 2第四课——HttpClient消息处理器
- 【ASP.NET Web API教程】3.4 HttpClient消息处理器
- HttpClient + ASP.NET Web API, WCF之外的另一个选择
- HttpClient读取ASP.NET Web API错误信息的简单方法
- HttpClient + ASP.NET Web API, WCF之外的另一个选择
- Asp.Net Web API 2第四课——HttpClient消息处理器
- 通过HttpClient 调用ASP.NET Web API
- 【转】asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端
- Asp.Net Web API 2第四课——HttpClient消息处理器
- http响应Last-Modified和ETag以及asp.net web api实现(转载)
- Asp.net web Api源码分析-HttpResponseMessage