自Asp.Net Web Api问世以来,一直没有去体验下,有些惭愧。不过在说Web Api之前还是要提一下Rest,Rest的英文全称是:Representational State Transfer,翻译过来就是“表征状态转移”。不过在看到这译过来的6个字,我也迷迷糊糊的,名字为什么这么怪?它是Roy Fielding在2000年的时候在他的论文里面提出的一种软件架构风格。
REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表征。获得这些表征致使这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变着其状态。并且Roy Fielding设计良好的网络应用表现为一系列的网页,这些网页可以看作的虚拟的状态机,用户选择这些链接导致下一网页传输到用户端展现给使用的人,而这正代表了状态的转变。关于更多Rest介绍可以移步这里。
Asp.net Web Api有三种使用形式,分别是:1) 自寄宿。2)Asp.net Mvc 。3)Asp.Net Web Form 。本文主要讲解自寄宿形式。
如果大家没有安装VS2012,那么久让VS2010升级SP1补丁即可,先在VS2010下新建一个空项目解决方案,命名:WebApi,因这里是使用自寄宿形式,所以我是在控制台下面实现的。在解决方案下新增两个控制台项目ApiHost,Client。例子中涉及到操作学生信息,所以新建了一个Model项目,里面含有一个Student实体类。项目结构如下:
项目新建完之后,我们还要用Nuget工具添加针对Asp.Net Web API自我寄宿相关的引用,操作步骤如下:
1)如果在VS2010下面没有安装Nuget插件的话,我们可以这样添加
按照这个操作,打开“扩展管理器”,在里面搜索"Nuget"
此时点击安装即可。
2) 服务端,客户端添加针对Asp.net Web API的引用
接下来会弹出新窗体,在里面搜索"Web API","Self Host"
按照上面2步操作,准备工作算是完成了。
Asp.net Web API 直接借鉴了Asp.net MVC 的设计,两者具有极为相同的编程方式。先在ApiHost项目新建一个Student的Controll,这里的Controll必须继承ApiController,它是一个抽象类,继承IHttpController接口。具体代码如下:
public class StudentController : ApiController { public IList<Student> GetStudentLst() { return Students; } public Student GetStudentById(int Id) { return Students.FirstOrDefault(w => w.ID == Id); } public void DeleteStudentById(int Id) { var stu = Students.FirstOrDefault(w => w.ID == Id); Students.Remove(stu); } static IList<Student> Students = new List<Student>() { new Student{ID = 100,Name="tauruswu",Sex="男",Grade="大学一年级"}, new Student{ID = 101,Name="赵文卓",Sex="女",Grade="大学四年级"}, new Student{ID = 102,Name="成东青",Sex="女",Grade="大学三年级"}, new Student{ID = 103,Name="王阳",Sex="男",Grade="大学三年级"}, new Student{ID = 104,Name="孟晓俊",Sex="女",Grade="大学一年级"}, new Student{ID = 105,Name="良琴",Sex="男",Grade="大学二年级"} }; }
上述代码分别定义了两个Get操作,一个Delete操作。
对StudentControll的自我寄宿定义在Program里面,如下代码所示,我们针对监听地址http://127.0.0.1:8080创建了一个HttpSelfHostConfiguration对象,并且进行相应路由注册。然后针对HttpSelfHostConfiguration创建一个HttpSelfHostServer对象,调用OpenSync方法启动寄宿的Web API。
static void Main(string[] args) { var baseAddr = new Uri("http://127.0.0.1:8080"); var hostConfig = new HttpSelfHostConfiguration(baseAddr); hostConfig.Routes.MapHttpRoute("ApiService", "Api/{Controller}/{Id}", new { Id = RouteParameter.Optional }); using (HttpSelfHostServer hostServer = new HttpSelfHostServer(hostConfig)) { hostServer.OpenAsync().Wait(); Console.WriteLine("已经启动寄宿的Web Api."); Console.WriteLine(); Console.WriteLine("按任意键离开."); Console.ReadLine(); } }
在客户端Client项目里面运用HttpClient对象进行Web Api的调用。
static HttpClient client = new HttpClient(); static void Main(string[] args) { client.BaseAddress = new Uri("http://127.0.0.1:8080"); Console.WriteLine("开始获取所有学生列表:"); GetStudentLst(); Console.WriteLine(); Console.WriteLine("获取学号等于101的学生信息:"); GetStudentById(101); Console.WriteLine(); Console.WriteLine("删除学号等于102的学生信息:"); RemoveStaudentBy(102); Console.WriteLine(); Console.WriteLine("获取最新学生列表:"); GetStudentLst(); Console.ReadLine(); } static void GetStudentLst() { HttpResponseMessage resp = client.GetAsync("Api/Student").Result; resp.EnsureSuccessStatusCode(); var students = resp.Content.ReadAsAsync<IList<Student>>().Result; foreach(var stu in students) { Console.WriteLine("学号:{0} 姓名:{1} 性别:{2} 年级:{3}", stu.ID,stu.Name,stu.Sex,stu.Grade); } } static void GetStudentById(int id) { HttpResponseMessage resp = client.GetAsync(string.Format("Api/Student/{0}",id)).Result; resp.EnsureSuccessStatusCode(); var stu = resp.Content.ReadAsAsync<Student>().Result; Console.WriteLine("学号:{0} 姓名:{1} 性别:{2} 年级:{3}", stu.ID, stu.Name, stu.Sex, stu.Grade); } static void RemoveStaudentBy(int id) { client.DeleteAsync(string.Format("Api/Student/{0}", id)).Wait(); }
我们看下上面的代码,先根据地址http://127.0.0.1:8080创建一个HttpClient对象,并用GetAsync()获取列表,单个信息,用DeleteAsync删除指定学生信息。运行效果图如下
到这里,一个简单的Web Api示例就结束了,是不是有那种入门很简单的感觉。Web API的调用本质就是一个HTTP请求发送和响应解析的过程,完全可以按照我们熟悉的方式来调用。Asp.net Web API采用了管道式设计,Asp.Net MVC也是如此。