HttpClient + ASP.NET Web API(附加WebClient HttpWebRequest JQuery AJAX请求方式)

还没有学习WCF,先学习了ASP.NET WebAPI,感觉REST风格的WebAPI非常简单,而且WebAPI框架同时使用了Web标准规范,比如HTTP、XML、JSON等,而且它和MVC很像,都使用了一些相同的核心概念,如路由、控制器等。WebAPI可以智能判断请求的格式 XML或者JSON 返回相应的格式,基于HTTP非常轻便。,下面说一下如何创建WebAPI项目:

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,先写到这里,有什么问题或者建议请给我留言


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值