65.9K
CodeProject 正在变化。 阅读更多。
Home

REST - 概述

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (9投票s)

2017 年 1 月 9 日

Apache

4分钟阅读

viewsIcon

15175

REST 概述

什么是 REST?

REST 简而言之就是表述性状态转移 (REST)。
REST 本身不是一个 Web 服务。它定义了提供者(服务器/被调用者)和消费者(客户端/调用者)之间的接口/约定。

我不了解 REST,我可以学习它以及如何学习吗?

是的,你可以学习。简单来说,你应该从用户基本 CRUD 操作开始。这将使你更容易理解。

好的,你能告诉我如何在 REST 中获取用户列表吗?

好的,我将向你展示如何在 REST 中获取用户列表,首先需要安装一些工具

  • 浏览器:Firefox/Chrome/Microsoft Edge。在这种情况下,我使用 Firefox。
  • 在你的浏览器中安装“RESTClient”插件。我们将使用此插件来向服务器发送和接收请求/响应。

该插件如下所示

我假设用户具有以下属性

  • 姓氏
  • 性别
  • 年龄

我们也在本文中使用这些属性。

对于在 REST 中获取用户列表

在这张照片中,我们需要注意以下几点

  • 获取用户列表的 URL 是:<根 URL>/users
  • 使用 HTTP 动词:GET
  • 使用“Accept”标头来指定要接收的数据类型(例如:application/json,...)

明白了,我可以使用其他 HTTP 动词(POST、PUT、Delete 等)来获取用户列表,而不是 GET 吗?

不,在 REST 中,每个 HTTP 动词都有其自己的含义。例如:POST 用于创建新用户,Delete 用于删除用户,....

我可以使用其他 URL(例如 <根 URL>/users/getUsers)来获取用户列表,就像我在 .asmx Web 服务中所做的那样吗?

不,在 REST 中,对 URL 的名称有约束。例如:它必须是一个名词(user)并且是复数形式(user => users),...

我看到你提到了 REST 中的约束,它们是什么?

现在,我认为我们应该首先关注如何在我们的 API 中使用 REST,稍后我们将讨论更多关于约束的内容,因为它可能会让你感到困惑。

获取 XML 格式的用户列表怎么样?

请将“Accept”标头更改为“application/xml”。结果将是

我的 REST 应该支持多少种数据格式(JSOM、XML、CSV、text、....)?

这取决于你的业务,我们可以根据需要添加更多或更少。三种常见的格式是 JSON、XML 和 CSV。

我可以使用哪种编程语言来实现 REST?

简单来说,在 REST 中,它定义了客户端/服务器之间交互的接口。所以我们可以在任何编程语言中实现,例如:C#、VB、Javascript、Php、Java、Python,....

并且 API 应该遵循 REST 的标准,例如:向我的 API (https://)发送“GET”请求,URL 为 "https:///users" + accept="application/json",应该以 JSON 格式返回用户列表。

你能向我展示获取上面用户列表的服务器代码吗?

当然可以,代码是用 C# 使用 WebApi 编写的。

namespace WebApi.Controllers
{
    [RoutePrefix("api/users")]
    public class UsersController : ApiController
    {
        private static IList<User> Users { get; set; }
        static UsersController()
        {
            UsersController.Users = new List<User>() {
                new User(1, "User", "1", "Male", 20),
                new User(2, "User", "2", "Male", 20),
            };
        }
        [Route("")]
        [HttpGet()]
        public IList<User> GetUsers()
        {
            return UsersController.Users;
        }
    }
}

UsersController 中,我简单地定义了“GetUsers”函数,该函数可以使用 HttpGet 动词调用,该函数将按预期返回用户列表(第 15、16 行)。

好的,获取用户列表非常简单,你能告诉我如何获取用户项目吗?

是的,这与上面几乎相同,需要将 URL 更新为 "<根 URL>/users/<userId>"。

以下是获取用户 #1 的截图。

我们注意到 URL 在 "<根 URL>/users/1" 中。

并且是 XML 格式

服务器上的代码将是

namespace WebApi.Controllers
{
    [RoutePrefix("api/users")]
    public class UsersController : ApiController
    {
        private static IList<User> Users { get; set; }
        static UsersController()
        {
            UsersController.Users = new List<User>() {
                new User(1, "User", "1", "Male", 20),
                new User(2, "User", "2", "Male", 20),
            };
        }
        [Route("{userId}")]
        [HttpGet()]
        public User GetUser(int userId)
        {
            return UsersController.Users.FirstOrDefault(item => item.Id == userId);
        }
    }
}

创建新用户怎么样?

要创建新用户,我们向 "<根 URL>/users" 发送 POST 请求。请求的主体是我们将数据发送到服务器,并在“content-type”标头中包含适当的值。

服务器使用 content-type 来识别数据的格式并反序列化为服务器端的适当对象。在本例中,它是 User 对象。

再次获取用户列表,我们可以看到新用户已添加到用户列表中

服务上的代码将是

namespace WebApi.Controllers
{
    [RoutePrefix("api/users")]
    public class UsersController : ApiController
    {
        private static IList<User> Users { get; set; }
        static UsersController()
        {
            UsersController.Users = new List<User>() {
                new User(1, "User", "1", "Male", 20),
                new User(2, "User", "2", "Male", 20),
            };
        }
        [Route("")]
        [HttpGet()]
        public IList<User> GetUsers()
        {
            return UsersController.Users;
        }
        [Route("")]
        [HttpPost()]
        public User CreateUser([FromBody]User user)
        {
            user.Id = UsersController.Users.Count + 1;
            UsersController.Users.Add(user);
            return user;
        }
    }
}

好的,让我们继续更新用户?

要更新用户,我们需要

  • 向服务器发送 PUT 请求
  • 格式为 "<根 URL>/users/<userId>" 的 URL
  • 使用“content-type”标头的正确值来指定发送到服务器的数据类型。

获取用户 #2,我们得到以下结果

在服务器上,我们将此代码添加到 UsersController

[Route("{userId}")]
[HttpPut()]
public void UpdateUser(int userId, [FromBody]User user)
{
	User currentUser = UsersController.Users.FirstOrDefault(item => item.Id == userId);
	currentUser.FirstName = user.FirstName;
	currentUser.LastName = user.LastName;
	currentUser.Gender = user.Gender;
	currentUser.Age = user.Age;
}

关于 CRUD 中的最后一个操作,delete 一个用户?

要删除用户,我们需要

  • 使用 DELETE 动词
  • 发送到格式为 "<根 URL>/users/<userId>" 的 URL
  • 通过此操作,我们不需要使用 content-type,因为服务器只需要从客户端获取 userId

再次获取列表,仅从 API 返回 1 个项目

我可以在哪里找到这篇文章的代码?

请从 https://github.com/techcoaching/webapi 下载。

摘要

现在,我们来看看如何使用 C# (WebApi) 中的 REST 执行 CRUD。

在下一篇文章中,我们将更深入地研究 REST 的其他方面,例如约束、性能,....

如果你有任何问题,请在下面写下评论,我会尽快回答。

感谢您的阅读。

注意:如果您认为这篇文章对您有帮助,请点赞并与您的朋友分享,我将不胜感激。
© . All rights reserved.