Q1. 什么是 REST?
Ans. REST 是 Representational State Transfer(表述性状态传递)的简称。是一项用于分布式环境数据交换的协议。
REST 是一种架构风格,它将每个服务对待为资源并通过 Http 协议方法(GET、POST、PUT、DELETE)获取数据。
REST 风格的架构包含客户端和服务端。
客户端初始化请求到服务器,服务器负责处理请求并返回响应。
这些请求和响应都是围绕这些资源的表示形式进行传递。
Q2. 解释下 REST 原则?
Ans. REST 是一系列原则,用来定义 web 标准,比如 HTTP、URIs 如何被使用。
主要有以下 5 条重要的 REST 原装:
AddressableResources(可访问的资源) - 每一个资源都应该能被 URI(唯一标识符)确定。
Simple and Uniform Interfaces(有一致接口) - REST 是基于 HTTP 协议的,使用 HTTP GET, POST, PUT, DELETE
来执行操作。使得 REST 简单一致。
RepresentationOriented(面向表述) - 资源的表现形式可以交换的。GET 用来获取资源的某种表现形式,POST 用来传递资源到服务器以至于底层资源能够被改变。Representation 可以有很多种表现形式,比如 XML、Json 等。
Communicate Stateless(无状态通信) - 一个应用程序可以拥有状态但是没有客户端会话数据存储在服务器。任何会话类型的数据应该在客户端保存和处理,只有在每次请求中按需传递到服务器。
Cacheable(可缓存) - 客户端应该能够缓存响应以供后续使用。
Q3. REST 和 SOAP 间的区别是什么?
Ans. 详见下表:
SOAP | REST |
---|---|
SOAP 是 Simple Object Access Protocol(简单对象访问协议) 的简称 | REST 是 Representational State Transfer(表述性状态传递) 的简称 |
它是一个基于 XML 的协议,建立在 HTTP 或 TCP/IP,SMTP 基础之上。 | REST 不是一个协议而是一种架构风格。 比如:基于资源的架构。 |
SOAP 提供了无状态和有状态的两种实现方式。 | REST 是无状态的。 |
SOAP 使用 xml 作为消息格式 | REST 支持 xml,json |
SOAP 定义了标准的规范。比如:WS-Security 是实现安全的规范 | 未定义标准规范 |
SOAP 消息包含了一个信封,里面包含了 SOAP 的 Header、Body(用来存储你实际要发送的信息) | REST 使用 HTTP 集成的 header(支持多种媒体类型)去携带元数据,使用 GET、POST、PUT、DELETE 动词执行 CURD |
SOAP 使用接口以及命名的操作去调用 Service。 | REST 使用 URI 以及 (GET, PUT, POST, DELETE) 方法来调用 Service。 |
比 REST 慢 | 比 SOAP 快 |
Q4. 什么是 ASP.NET WEB API?
Ans. ASP.NET WEB API 是一个框架用来搭建 HTTP 服务以供客户端(比如:浏览器,手机,IPhone 等)调用。它与 ASP.NET MVC 很相似因为它包含 mvc 的功能,比如 routing, controllers, action results, filter, model binders, IOC container or dependency injection。
但是它并不是 MVC 框架的一部分。它是
ASP.NET 平台的核心部分。能被 MVC 或者其他类型的 web 应用使用。同时它也可以用作独立的 web 服务应用程序。
ASP.NET WEB API 功能
格式化为 JSON, XML 或者任何你想添加作为
- MediaTypeFormatter
的任何格式。
- MediaTypeFormatter
。因此将
- OData
特性添加到 controller 的方法中,它将会返回
- [Queryable]
结果, 客户端可以使用该方法进行 OData 组合查询。
- IQueryable
Q5. 为什么要选择 ASP.NET WEB API?
Ans. 如今,基于 Web 的应用程序已经远不能满足客户需求。在日常生活中人们使用 iphone,手机,平板等。这些设备有一系列的 app 软件来提供便利的服务。因此我们的关注点不再仅仅是 web 还有 app。
所以,如果你想以快速且简单的方式暴露你的服务端数据到浏览器端和现代设备 app 上,你应该有一个 API,它负责兼容浏览器和所有设备。
比如:twitter,facebook,Google Api 都支持 web 应用程序和手机 app。
WEB API 是一个很棒的框架用来暴露你的数据和服务到不同的设备。而且 WEB API 是一个开源的平台基于. net framework 来提供 Rest-ful 的服务。
不像 WCF REST Service,它使用 HTTP 完整的功能(URIs,request/response headers,caching,versioning,various content formats),你不需要像 wcf rest service 那样为不同的设备定义额外的配置文件
Why to choose WEB API?
Q6. WCF、WEB API、 WCF REST 、Web Service 之间的区别是?
Ans. 主要区别是:
Web Service
WCF
WCF Rest
WEB API
格式化为 JSON、 XML 或者任何你想要添加作为
- MediaTypeFormatter
的任何格式。
- MediaTypeFormatter
Q7. 在 WCF 和 WEB API 之间如何选择?
Ans. 可以从以下几点进行考虑:
Q8. ASP.NET MVC 与 ASP.NET WEB API 之间的区别是?
Ans. 主要有以下区别:
Q9. WEB API 能返回 View 吗?
Ans. 与 ASP.NET MVC 不同,WEB API 仅能返回数据,返回的数据格式可以为 string,json,xml,text 等。
Q10. 可以如同 ASP.NET MVC 那样修改 WEB API 的 action name 吗?
Ans. 可以,通过使用
特性即可修改 action name:
- [ActionName]
- [HttpGet]
- [ActionName("GetProducts")]
- public IEnumerable<Product> ProductList()
- {
- return db.Products.AsEnumerable();
- }
Q11. 如何限制 WEB API 的 Aciton 仅能被 HTTP GET,POST,PUT,DELETE 访问?
Ans. 简单,和 ASP.NET MVC 类似,通过使用
特性来达到这一目的。 比如,如果你想限制一个 Action 仅能被 HTTP Get 请求访问,可以在 Action 上使用
- [HttpGet]、[HttpPost]、[HttpPut]、[HttpDelete]
特性即可,如下:
- [HttpGet]
- [HttpGet]
- public IEnumerable<Product> ProductList()
- {
- return db.Products.AsEnumerable();
- }
Q12. 如何在 ASP.NET MVC 中调用 WEB API?
Ans. ASP.NET WEB API 可以通过使用 HttpClient 请求 WEB API 地址的方式来调用:
- public class ProductController : Controller
- {
- HttpClient Client = new HttpClient();
- Uri BaseAddress = new Uri("http://localhost:131/");
- public ActionResult Index()
- {
- Client.BaseAddress = BaseAddress;
- HttpResponseMessage response =
- Client.GetAsync("productservice/GetProducts").Result;
- if (response.IsSuccessStatusCode)
- {
- var data = response.Content.ReadAsAsync<IEnumerable<Product>>().Result;
- return View(data);
- }
- return View();
- }
- }
Q13. ASP.NET WEB API 路由与 ASP.NET MVC 路由有什么区别?
Ans. ASP.NET MVC 与 ASP.NET WEB API 使用路由来监控传入的请求。主要的区别有以下几点:
Q14. ASP.NET WEB API2 中如何启用特性路由?
Ans. 简单,仅仅需要在
类的
- WebApiConfig.cs
方法添加对
- Register()
方法的调用即可。
- MapHttpAttributeRoutes()
- public static class WebApiConfig
- {
- public static void Register(HttpConfiguration config)
- {
- //enabling attribute routing
- config.MapHttpAttributeRoutes();
- }
- }
同时你也可以合并使用特性路由和基于约定的路由。
- public static class WebApiConfig
- {
- public static void Register(HttpConfiguration config)
- {
- //enabling attribute routing
- config.MapHttpAttributeRoutes();
- // Convention-based routing.
- config.Routes.MapHttpRoute(
- name: "DefaultApi",
- routeTemplate: "api/{controller}/{id}",
- defaults: new { id = RouteParameter.Optional }
- );
- }
- }
Q15. 如何在 ASP.NET WEB API2 中定义特性路由?
Ans. 像 ASP.NET MVC5 那样,可以在 WEB API2 的 controller 级别和 action 级别定义特性路由:
Controller level routing(控制器级别路由)
在控制器级别定义的特性路由将应用到所有 action,除非 action 上指定了特定的路由。
- [RoutePrefix("Service/User")]
- public class UserController : ApiController
- {
- //GET route: api/User
- public IEnumerable<string> Get()
- {
- return new string[] { "value1", "value2" };
- }
- [Route("{id}")] //GET route: Service/User/1
- public string Get(int id)
- {
- return "value";
- }
- [Route("")] //POST route: Service/User/
- public void Post([FromBody]string value)
- {
- }
- }
Action level routing(Action 级别路由)
给 Controller 下的特定 Action 指定路由。
- public class UserController : ApiController
- {
- //GET route: api/User
- public IEnumerable<string> Get()
- {
- return new string[] { "value1", "value2" };
- }
- [Route("Service/User/{id}")] //GET route: Service/User/1
- public string Get(int id)
- {
- return "value";
- }
- [Route("Service/User/")] //POST route: Service/User/
- public void Post([FromBody]string value)
- {
- }
- }
来源: http://www.cnblogs.com/sheng-jie/p/6585469.html