您的位置:首页 > 理论基础 > 计算机网络

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

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,先写到这里,有什么问题或者建议请给我留言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: