重温ASP.NET WebAPI(一)初阶
前言
本文为个人对WebApi的回顾无参考价值。主要简单介绍WEB api和webapi项目的基本结构,并创建简单地webaapi项目实现CRUD操作。
在商业应用领域中,应用之间的关联是相当重要的,应用之间如移动应用或者单页应用的创建,都需要强大的后端服务提供相应的数据以便进行CRUD操作。
WCF and WebApi 的不同
WCF是基于SOAP协议,支持多种传输协议,多种编码,寄宿于.net framework下,需要生产WSDL代理类文件,更安全可靠。
WebApi是基于HTTP协议,支持XML和json,开源可独立出.net framework。REST风格更适合。
WCF |
ASP.NET Web API |
支持多种传输协议(HTTP, TCP, UDP和自定义传输协议),允许在协议之间进行切换 |
只支持HTTP协议。比较适合传输来自各种浏览器、移动应用。 |
支持多种编码格式(Text, MTOM, Binary),允许相互切换。 |
支持各种媒体类型,如XML和JSON |
符合Web服务标准(可靠的数据,传输,和数据安全) |
不支持高标准的协议,如数据可靠性或者传输准确性。基于基本的协议和排版,如HTTP, WebSockets, SSL, JQuery, JSON, XML |
支持请求回复、单线和多重消息交换模式 |
支持HTTP的请求响应模式,但也支持扩展的,如SignalR和WebSocket的整合 |
基于SOAP协议,因此需要被描述为WSDL,允许自动化工具生成客户端代理,即使服务含有复杂的模式 |
支持多种方式描述API。从自动生成HTML帮助页面描述,到使用结构metadata整合ODATA到APIs中等等。 |
寄宿于.net framework |
寄宿于.net framework但是开源,也能够独立的下载 |
使用WCF创建可靠,安全的web服务,可以支持多种传输协议。使用WebAPI创建基于http协议的服务,服务更广的用户群。当创建和设计新的基于REST风格的服务是,采用webapi。虽然WCF也提供支持写REST风格的服务,但是Webapi的支持更好。
SOAP 和 ASP.NET Web 服务
SOAP是基于标准XML的协议,能够与HTTP通讯。可以理解为程序之间通过以XML为格式的SOAP协议进行通讯。ASP.NET Web服务提供创建SOAP协议的web服务。
SOAP的问题
- 元数据metadata也会被传输,占用传输空间。
- 需要在客户端创建代理类。当服务端更新服务,客户端也要及时更新代理类。
REST
REST协议用于分布式环境的数据传输,它使我们能够将分布式服务当做一种资源,并通过简单的HTTP协议来操作这些资源。
REST对应数据库CRUD操作的方式,分为4种:
- GET:相当于CRUD操作中的R,数据获取
- PUT:相当于CRUD操作中的U,数据更改
- POST:相当于CRUD操作中的C,数据创建
- DELETE:相当于CRUD操作中的D,数据删除
举例说明
当站点为:www.cnblogs.com/blogs, 则代表获取博客列表数据
当站点为www.cnblogs.com/blogs/1,则取决于type类型,如果是put,则创建新的BLOG。
如果是post,则更新当前blog。如果是delete,则删除当前blog。
REST与SOAP对比
- 只有使用的数据被传输,而没有元数据。
- 省略了代理的创建。
WCF REST服务
WCF比web服务要晚出来。它提供更安全和成熟的方式去创建服务。通过WCF,我们可以定义自己的服务,并配置相关的协议如HTTP,TCP或者IPC甚至消息队列。WCF也可以创建REST服务。
WCF创建REST服务,需要我们做大量的配置工作。通常WCF适用于一些特殊场景,如单向消息传输,消息队列,双工通信。但是使用WCF创建REST服务过于复杂,而且局限于.net 3.5 framework。
ASP.NET Web API介绍
微软提出ASP.NET Web API可以理解为一个框架,用于快速简易的创建REST服务。
Web API的入门创建
我们可以点开Values的controller,它集成ApiController,实现的一般的Get,Post,Put,Delete的功能。并提供了响应的URL路径说明。
public class ValuesController : ApiController { // GET api/values public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET api/values/5 public string Get(int id) { return "value"; } // POST api/values public void Post([FromBody]string value) { } // PUT api/values/5 public void Put(int id, [FromBody]string value) { } // DELETE api/values/5 public void Delete(int id) { } }
打开App_Start文件下的RouteConfig.cs文件,可以看到完整的api路由设置。
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
实现自己的webapi
public class UserController : ApiController { public IHttpActionResult GetRead() { var employeeListViewModel = new EmployeeListViewModel(); var empBal = new EmployeeBusinessLayer(); var employees = empBal.GetEmployees(); var empViewModels = employees.Select(emp => new EmployeeViewModel { Name = emp.Name, Salary = emp.Salary.ToString(), SalaryColor = emp.Salary > 15000 ? "yellow" : "green" }).ToList(); employeeListViewModel.Employees = empViewModels; employeeListViewModel.UserName = User.Identity.Name; return Ok(employees); } }
以上是初阶的内容,进阶地址:
http://www.cnblogs.com/ruanyifeng/p/5455105.html