REST - 概述






4.78/5 (9投票s)
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 的其他方面,例如约束、性能,....
如果你有任何问题,请在下面写下评论,我会尽快回答。
感谢您的阅读。