REST以及RESTful的实现:Web API

什么是REST?

REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。

在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是应用程序状态的引擎,资源表示通过超链接互联。

另一个重要的 REST 原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。当 REST 架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。

REST 简化了客户端和服务器的实现。由于轻量级以及通过 HTTP 直接传输数据的特性,Web 服务的 RESTful 方法已经成为最常见的替代方法。可以使用各种语言(比如 Java 程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])实现客户端。RESTful Web 服务通常可以通过自动客户端或代表用户的应用程序访问。但是,这种服务的简便性让用户能够与之直接交互,使用它们的 Web 浏览器构建一个 GET URL 并读取返回的内容。

在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、POST、PUT、DELETE,还可能包括 HEADER 和 OPTIONS。

基于RESTful标准的实现:微软的web api

微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码可读性强的,上手快的,如果要拿它和web服务相比,我会说,它的接口更标准,更清晰,没有混乱的方法名称,有的只有几种标准的请求,如get,post,put,delete等,它们分别对应的几个操作,下面讲一下:

GET:生到数据列表(默认),或者得到一条实体数据

POST:添加服务端添加一条记录,记录实体为Form对象

PUT:添加或修改服务端的一条记录,记录实体的Form对象,记录主键以GET方式进行传输

DELETE:删除 服务端的一条记录

注意上面公开的API接口都是在XMLHttpRequest情况下调用的,当然你可以使用jquery的ajax组件来完成这个请求调用,它的代码更加面向对象,下面举例说明一下


<html>
<head runat="server">
    <meta name="viewport" content="width=device-width" />
    <title>Web Api Test</title>
    <script src="../../Scripts/jquery-1.7.1.min.js"></script>
    <script type="text/javascript">
        
            function add() {
                $.ajax({
                    url: "/api/test/",
                    type: "POST",
                    data: { "UserID": 4, "UserName": "test", "UserEmail": "Parry@cnblogs.com" },
                    success: function(data) { alert(JSON.stringify(data)); }
                });
            }

            //更新
            function update(id) {
                $.ajax({
                    url: "/api/test?id=" + id,
                    type: "Put",
                    data: { "UserID": 1, "UserName": "moditest", "UserEmail": "Parry@cnblogs.com" },
                    success: function(data) { alert(JSON.stringify(data)); }
                });
            }

            function deletes(id) {
                $.ajax({
                    url: "/api/test/1",
                    type: "DELETE",
                    success: function(data) { alert(data); }
                });
            }
 </script>

</head>
<body>
    <div>
        <fieldset>
    <legend>测试Web Api
    </legend>
    <a href="javascript:add()">添加(post)</a>
    <a href="javascript:update(1)">更新(put)</a>
    <a href="javascript:deletes(1)">删除(delete)</a>
    <a href="/api/test">列表(Get)</a>
    <a href="/api/test/1">实体(Get)</a>
</fieldset>
    </div>
</body>
</html>



创建 Web API 工程


启动 Visual Studio ,在开始页里选择“新建项目”。或者从“文件”菜单里,选择“新建项目”。

在模板面板中,选择“已安装”,并展开 Visual C# 节点。在 Visual C# 下面,选择 Web。在项目模板列表中,选择 ASP.NET MVC 4 Web 应用程序。将项目命名为 "HelloWebAPI" 然后点击“确定”。



在弹出的“新 ASP.NET MVC 4 项目”对话框中,选择“Web API”然后点“确定”。




添加模型

模型是指程序里的对象。 ASP.NET Web API 能够自动序列化模型为JSON,XML或者其它的格式,然后将序列化后的数据写入HTTP响应信息体里。只要客户端能读到序列化格式,它就能反序列化为对象。大部分的客户端都能够解析XML或JSON。 而且,客户端通过设置HTTP请求信息里的Accept头就能够表明它想要什么样的格式。

我们就创建一个表示用户的模型来开始吧。

如果解决方案资源管理器没显示的话,点击“视图”菜单并选择“解决方案资源管理器”。在解决方案资源管理器重,右击“Models”文件夹。在弹出菜单中,选择“添加“,”类“。

将类命名为 "Users"。接下来在 User类里加入下面的属性:

namespace HelloWebAPI.Models
{
public class Users
{
public string UserID{ get; set; }
public string UserName { get; set; }
public string UserEmail { get; set; }
}
}



添加控制器

控制器是一个处理HTTP请求的对象。当你创建完项目以后,”新建项目“向导就自动创建了2个控制器。在解决方案资源管理器里展开”Controllers“目录就能看到了。

HomeController 是一个传统的 ASP.NET MVC 控制器。它只是负责处理站点的HTML页,跟Web API没有直接关系。
ValuesController 是一个示例 WebAPI 控制器。

注意 如果你之前已经搞过 ASP.NET MVC,那你肯定已经对控制器很熟了。它在Web API里也是类似的,只不过在Web API里控制器不是从Controller类继承而是从ApiController类继承了。你会注意到,第一个主要的不同点是Web API上的操作并不返回视图,而是返回数据。

解决方案资源管理里右击 ValuesController, 选择”删除“直接把他删掉。

如下所示,添加一个新的控制器:

解决方案资源管理里,右击 Controllers 目录,选择”添加“,”控制器“:




在”添加控制器“向导中,将控制器命名为 "TestController"。”模板“下拉框中,选择”空API控制器“。然后点”添加“。下面是ApiController部分的代码:

/// <summary>
/// Test模块API
/// URI:/Api/Test
/// </summary>
public class TestController : ApiController
{

/// <summary>
/// User Data List
/// </summary>
private readonly List<Users> _userList = new List<Users>
{
new Users {UserID = 1, UserName = "zzl", UserEmail = "bfyxzls@sina.com"},
new Users {UserID = 2, UserName = "Spiderman", UserEmail = "Spiderman@cnblogs.com"},
new Users {UserID = 3, UserName = "Batman", UserEmail = "Batman@cnblogs.com"}
};
/// <summary>
/// 得到列表对象
/// </summary>
/// <returns></returns>
public IEnumerable<Users> Get()
{
return _userList;
}

/// <summary>
/// 得到一个实体,根据主键
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Users Get(int id)
{
return _userList.FirstOrDefault(i => i.UserID == id);
}

/// <summary>
/// 添加
/// </summary>
/// <param name="form">表单对象,它是唯一的</param>
/// <returns></returns>
public Users Post([FromBody] Users entity)
{
_userList.Add(entity);
return entity;
}

/// <summary>
/// 更新
/// </summary>
/// <param name="id">主键</param>
/// <param name="form">表单对象,它是唯一的</param>
/// <returns></returns>
public Users Put(int id, [FromBody]Users entity)
{
var user = _userList.FirstOrDefault(i => i.UserID == id);
if (user != null)
{
user.UserName = entity.UserName;
user.UserEmail = entity.UserEmail;
}
return user;
}
/// <summary>
/// 删除
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
public void Delete(int id)
{
_userList.Remove(_userList.FirstOrDefault(i=>i.UserID==id));
}
}



结束语

REST 描述了一个架构样式的互联系统(如 Web 应用程序)。REST 约束条件作为一个整体应用时,将生成一个简单、可扩展、有效、安全、可靠的架构。由于它简便、轻量级以及通过 HTTP 直接传输数据的特性,RESTful Web 服务成为基于 SOAP 服务的一个最有前途的替代方案。用于 web 服务和动态 Web 应用程序的多层架构可以实现可重用性、简单性、可扩展性和组件可响应性的清晰分离。Ajax 和 RESTful Web 服务本质上是互为补充的。开发人员可以轻松使用 Ajax 和 RESTful Web 服务一起创建丰富的界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值