还没有学习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) { }
}
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();
}
}
<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,先写到这里,有什么问题或者建议请给我留言