static HttpClient httpClient = new HttpClient(); static void Main(string[] args) { //由于HttpClient类中的方法大部分为异步 //Main方法不支持Async关键字 //故新建一个方法,使其同步运行 Process(); Console.Read(); } async static void Process() { //获取当前联系人列表 ListContacts(); //添加新的联系人 var contact = new Contact { Name = "王五" }; await httpClient.PostAsJsonAsync("http://localhost/selfhost/api/contacts", contact); Console.WriteLine("添加新联系人“王五”:"); ListContacts(); //修改现有的某个联系人 var response = await httpClient.GetAsync("http://localhost/selfhost/api/contacts/001"); contact = (await response.Content.ReadAsAsync<IEnumerable<Contact>>()).First(); contact.Name = "赵六"; await httpClient.PutAsJsonAsync("http://localhost/selfhost/api/contacts/001", contact); Console.WriteLine("修改联系人“001”信息:"); ListContacts(); //删除现有的某个联系人 await httpClient.DeleteAsync("http://localhost/selfhost/api/contacts/002"); Console.WriteLine("删除联系人“002”:"); ListContacts(); } async static void ListContacts() { var response = await httpClient.GetAsync("http://localhost/selfhost/api/contacts"); IEnumerable<Contact> contacts = await response.Content.ReadAsAsync<IEnumerable<Contact>>(); Console.WriteLine("当前联系人列表:"); foreach (Contact contact in contacts) { Console.WriteLine("{0,-6}{1,-6}", contact.Id, contact.Name); } Console.WriteLine(); }
Web API原理
Web API借用了MVC的设计,以Controller形式定义服务,Action代表具体的操作.
Web API借助于URL路由得到控制器,再根据路由对象,通过http方法找到对应的action.(实际上,如果根据url解析不到action的时候,才会通过http方法)
路由注册
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
由于在模板中没有定义action,所以只能通过httpmethod来找action.(并且是根据方法前缀匹配即可)
通过浏览器api/Contacts查看的时候,会返回一个xml格式的数据.
实际上,webapi是先检查accept,从左到右,去匹配序列化器,如果没有匹配到则使用默认的json序列化器.
管道式设计
Web API也采用了管道式设计,这是一个不同于MVC的管道.虽然很多地方和MVC相似.
Route对象为HttpRoute
Handle对象为HttpControllerHandler(由于实现了IHttpAsyncHandler接口,所以默认走BeginProcessRequest异步方法)
本文地址:
参考: