RESTful Web 服务教程:什么是 REST API(附示例)

什么是 Restful Web 服务?

宁静的Web服务 是基于 REST 架构构建的轻量级、可维护且可扩展的服务。Restful Web 服务以安全、统一、无状态的方式向调用客户端公开来自应用程序的 API。调用客户端可以使用 Restful 服务执行预定义的操作。REST 的底层协议是 HTTP。REST 代表表述性状态转移。

RESTful 关键元素

REST Web 服务自诞生以来已经取得了长足的进步。2002 年,Web 联盟发布了 WSDL 和 SOAP Web 服务的定义。这形成了 Web 服务实现方式的标准。

2004 年,网络联盟还发布了一项名为 RESTful 的附加标准的定义。在过去的几年中,该标准已经变得非常流行。全球许多流行网站都在使用它,其中包括 Facebook 和 Twitter。

REST 是一种访问特定环境中的资源的方式。例如,您可能拥有一个服务器,该服务器可能托管重要文档、图片或视频。所有这些都是资源的示例。如果客户端(例如 Web 浏览器)需要这些资源中的任何一个,它必须向服务器发送请求以访问这些资源。现在,REST 服务定义了一种访问这些资源的方式。

RESTful 实现的关键要素如下:

  1. 更多 – 第一个关键元素是资源本身。假设服务器上的 Web 应用程序包含多位员工的记录。假设 Web 应用程序的 URL 为 https://demo.guru99.com。现在,为了通过 REST 服务访问员工记录资源,可以发出命令 https://demo.guru99.com/employee/1 – 此命令告诉 Web 服务器请提供员工编号为 1 的员工的详细信息。
  2. 请求动词 – 这些描述了您想要对资源执行的操作。浏览器发出 GET 动词来指示它想要获取数据的端点。但是,还有许多其他动词可用,包括 POST、PUT 和 DELETE 等。因此,在示例中 https://demo.guru99.com/employee/1 ,Web 浏览器实际上是在发出 GET 动词,因为它想要获取员工记录的详细信息。
  3. 请求标题 – 这些是随请求发送的附加指令。这些指令可能定义所需的响应类型或授权详细信息。
  4. 请求正文 – 数据随请求一起发送。当向 REST Web 服务发出 POST 请求时,数据通常会随请求一起发送。在 POST 调用中,客户端实际上会告诉 REST Web 服务它想要向服务器添加资源。因此,请求主体将包含需要添加到服务器的资源的详细信息。
  5. 响应体 – 这是响应的主体。因此,在我们的 RESTful API 示例中,如果我们通过请求查询 Web 服务器 https://demo.guru99.com/employee/1 ,Web 服务器可能会返回一个 XML 文档,其中包含响应主体中员工的所有详细信息。
  6. 响应状态代码 – 这些代码是与 Web 服务器响应一起返回的通用代码。例如,如果在向客户端返回响应时没有错误,通常会返回代码 200。

Restful 方法

下图展示了大部分动词(POST、GET、PUT 和 DELETE)以及它们含义的 REST API 示例。

我们假设我们在该位置定义了一个 RESTful Web 服务。 https://demo.guru99.com/employee 。当客户端向此 Web 服务发出任何请求时,它可以指定任何常规 HTTP 动词 GET、POST、DELETE 和 PUT。如果客户端发送了相应的动词,则会发生以下情况。

  1. 解决方案&帖子 – 这将用于使用 RESTful Web 服务创建新员工
  2. 的GET – 这将用于获取使用 RESTful Web 服务的所有员工列表
  3. PUT – 这将用于使用 RESTful Web 服务更新所有员工
  4. 删除 – 这将用于删除所有使用 RESTful 服务的员工

我们先从单条记录的角度来看一下。假设有一条员工记录,其员工编号为 1。

以下行动有其各自的含义。

  1. 解决方案&帖子 – 这不适用,因为我们正在获取已创建的员工 1 的数据。
  2. 的GET – 这将用于使用 RESTful Web 服务获取员工编号为 1 的员工的详细信息
  3. PUT – 这将用于使用 RESTful Web 服务更新员工编号为 1 的员工的详细信息
  4. 删除 – 用于删除员工编号为 1 的员工的详细信息

Restful 方法

为什么要 Restful

Restful 之所以流行,主要有以下几个原因:

1. 异构语言和环境 – 这是根本原因之一,正如我们所看到的 SOAP 以及。

  • 它使基于各种编程语言构建的 Web 应用程序能够相互通信
  • 借助 Restful 服务,这些 Web 应用程序可以驻留在不同的环境中,有些可以位于 Windows,其他的可能在Linux上。

但最终,无论环境如何,最终结果应该始终是相同的,即它们应该能够相互通信。Restful Web 服务为基于各种编程语言和平台构建的应用程序提供了这种灵活性,使它们能够相互通信。

下图给出了一个需要与其他应用程序(如 Facebook、Twitter 和 Google)对话的 Web 应用程序的示例。

现在,如果客户端应用程序必须与 Facebook、Twitter 等网站协同工作,他们可能必须知道 Facebook、Google 和 Twitter 是基于什么语言构建的,以及是基于什么平台构建的。

基于此,我们可以为我们的Web应用程序编写接口代码,但这可能是一场噩梦。

Facebook、Twitter 和 Google 以 Restful Web 服务的形式公开其功能。这允许任何客户端应用程序通过 REST 调用这些 Web 服务。

需要休息

2. 设备事件 – 如今,一切都需要努力 联络号码 设备,无论是移动设备、笔记本电脑、还是汽车系统。

您能想象在这些设备上尝试编写应用程序以与普通 Web 应用程序对话需要付出多大的努力吗?Restful API 可以使这项工作更简单,因为正如第 1 点所述,您真的不需要知道设备的底层是什么。

3. 最后是云事件 – 一切都在向云端转移。应用程序正在慢慢地转移到基于云的系统,例如 Azure or Amazon. Azure 和 Amazon 提供大量基于 Restful 架构的 API。因此,现在需要以与云兼容的方式开发应用程序。由于所有基于云的架构都基于 REST 原则,因此在基于 REST 服务的架构上对 Web 服务进行编程更有意义,以便充分利用基于云的服务。

宁静的 Archi质地

被视为 RESTful 或 REST 风格的应用程序或架构具有以下特征

1. 状态和功能被划分为分布式资源 – 这意味着每个资源都应该可以通过常规 HTTP 命令 GET、POST、PUT 或 DELETE 访问。因此,如果有人想从服务器获取文件,他们应该能够发出 GET 请求并获取文件。如果他们想将文件放到服务器上,他们应该能够发出 POST 或 PUT 请求。最后,如果他们想从服务器删除文件,他们可以发出 DELETE 请求。

2.架构为客户端/服务器、无状态、分层且支持缓存

  • 客户端-服务器是典型的架构,其中服务器可以是托管应用程序的 Web 服务器,而客户端可以像 Web 浏览器一样简单。
  • 无状态意味着 REST 中不维护应用程序的状态。例如,如果您使用 DELETE 命令从服务器中删除资源,则不能期望删除信息会传递到下一个请求。

为了确保资源被删除,您需要发出 GET 请求。GET 请求将首先用于获取服务器上的所有资源。之后需要查看资源是否确实被删除。

RESTFul 原则和约束

REST 架构基于以下几个特征。任何 RESTful Web 服务都必须符合以下特征才能称为 RESTful。这些特征也称为设计原则,在使用基于 RESTful 的服务时需要遵循这些原则。

  1. RESTFul 客户端-服务器

    RESTFul 原则和约束

这是基于 REST 的架构的最基本要求。这意味着服务器将具有 RESTful Web 服务,该服务将为客户端提供所需的功能。客户端向服务器上的 Web 服务发送请求。服务器将拒绝请求或遵从并向客户端提供适当的响应。

  1. 无状态

无状态的概念意味着客户端需要确保向服务器提供所有必需的信息。这是服务器能够适当处理响应所必需的。服务器不应在客户端的请求之间维护任何类型的信息。这是一个非常简单的独立问答序列。客户端提出一个问题,服务器适当地回答。客户端将提出另一个问题。服务器不会记住之前的问答场景,需要独立回答新问题。

  1. 缓存

RESTFul 原则和约束

缓存概念是为了解决上一点中描述的无状态问题。由于每个服务器客户端请求本质上都是独立的,有时客户端可能会再次向服务器询问相同的请求。即使它过去已经请求过。此请求将发送到服务器,服务器将给出响应。这增加了网络流量。缓存是在客户端上实现的一个概念,用于存储已发送到服务器的请求。因此,如果客户端发出相同的请求,它将转到缓存并获取所需信息,而不是转到服务器。这节省了从客户端到服务器的往返网络流量。

  1. 分层系统

分层系统的概念是,可以在客户端和托管 RESTFul Web 服务的实际服务器之间插入任何附加层(例如中间件层)(中间件层是创建所有业务逻辑的地方。这可以是客户端在调用 Web 服务之前可以与之交互的额外服务。)。但这一层的引入需要透明,这样它才不会干扰客户端和服务器之间的交互。

  1. 接口/统一契约

这是 RESTful Web 服务应如何工作的底层技术。RESTful 基本上在 HTTP Web 层上工作,并使用以下关键动词来处理服务器上的资源

  • POST – 在服务器上创建资源
  • GET——从服务器检索资源
  • PUT – 更改资源状态或更新资源
  • DELETE – 从服务器移除或删除资源

在 ASP.NET 中创建您的第一个 Restful Web 服务

现在,在本 REST API 教程中,我们将学习如何在 ASP.NET 中创建 Restful Web 服务:

Web 服务可以用多种语言创建。许多集成开发环境都可用于创建基于 REST 的服务。

在此 RESTful API 示例中,我们将使用 Visual Studio 在 .Net 中创建 REST 应用程序。在我们的示例中,对于 Restful Web 服务,我们将模拟以下 REST 服务示例。

我们将拥有一个 Restful Web 服务,它可以处理下面的数据集。

下面的数据集合代表一家公司基于 Tutorialid 公开其拥有的教程的 REST API 示例。

教程编号 教程名称
0 阵列
1 队列
2 堆栈

在我们的 REST API 教程示例中,我们将实现以下 Restful 动词。

  1. 获取教程 – 当客户端调用此 Restful API 时,他们将获得来自 Web 服务的全部教程。
  2. 获取教程/Tutorialid – 当客户端调用此 Restful API 时,将根据客户端发送的 Tutorialid 赋予其 Tutorial 名称。
  3. POST 教程/教程名称 – 当客户端调用此 Restful API 时,客户端将提交插入 Tutorialname 的请求。然后,Web 服务会将提交的 Tutorial name 添加到集合中。
  4. 删除教程/Tutorialid– 当客户端调用此 Restful API 时,客户端将根据 Tutorialid 提交删除 Tutorialname 的请求。然后 Web 服务将从集合中删除已提交的 Tutorial name。

让我们按照本 RESTful API 教程中的以下步骤创建我们的第一个 RESTful Web 服务,执行上述实现。

如何创建你的第一个 Restful Web 服务

步骤1) 创建新项目。
第一步是创建一个空的 网络 Web 应用程序。在 Visual Studio 2013 中,单击菜单选项文件->新建项目。

创建 Restful Web 服务

单击“新建项目”选项后,Visual Studio 将为您提供另一个对话框,用于选择项目类型并提供项目的必要详细信息。本 RESTful API 教程的下一步将对此进行解释

步骤2) 输入项目名称和位置。

  1. 确保首先选择 RESTful Web 服务 C# ASP.NET Web 应用程序的 Web 模板。项目必须是此类型才能创建 Web 服务项目。通过选择此选项,Visual Studio 将执行必要的步骤来添加任何基于 Web 的应用程序所需的文件。
  2. 为您的项目命名,在我们的例子中为“Webservice.REST”。
  3. 然后确保给出存储项目文件的位置。

创建 Restful Web 服务

完成后,您将在 Visual Studio 2013 的解决方案资源管理器中看到创建的项目文件。

创建 Restful Web 服务

步骤3) 创建 Web 服务文件。
下一步是创建包含 RESTful Web 服务的 Web 服务文件

  1. 首先右键单击项目文件,如下图所示

创建 Restful Web 服务

  1. 在此步骤中,
    1. 右键单击项目文件
    2. 选择选项“添加->新项目”。

创建 Restful Web 服务

在出现的对话框中,您需要执行以下操作

  1. 选择 WCF 服务(启用 Ajax)选项 – 选择此类型的文件,它会导致 Visual studio 添加一些有助于创建 RESTful Web 服务的基本代码。WCF 代表 Windows 外场通讯 Foundation。WCF 是一个用于不同平台或同一平台的应用程序通过各种协议(如 TCP、HTTP、HTTPS)进行通信的库。Ajax 基本上是异步的 JavaScript 和 XML。AJAX 允许通过与后台服务器交换少量数据来异步更新网页。
  2. 接下来为服务命名,在我们的例子中为 TutorialService。
  3. 最后,单击添加按钮将服务添加到解决方案中。

创建 Restful Web 服务

步骤4) 进行配置。
下一步是实际进行配置更改,以使该项目能够完成 RESTful Web 服务的工作。这需要更改名为 网页配置。此文件与 Webservice 项目文件出现在同一个窗口中。文件 Web.config 包含使 Web 应用程序正常工作的所有配置。所做的更改实际上允许应用程序作为纯 RESTful Web 服务发送和接收数据。

  1. 点击Web.config文件打开代码

创建 Restful Web 服务

  1. 查找行

创建 Restful Web 服务

  1. 将行更改为

创建 Restful Web 服务

步骤5) 添加我们的代码以供实现。
本 RESTful API 教程的下一步是添加我们的代码以供实现。下面提到的所有代码都必须写入 TutorialService.svc 文件中

  1. 第一步是添加代码来表示将在程序中使用的数据。因此,我们将有一个字符串变量列表,其值为“Arrays”、“Queues”和“Stacks”。这将表示可通过我们的托管 Web 服务获得的教程名称。

创建 Restful Web 服务

namespace Webservice.REST
{
	[ServiceContract(Namespace = "")]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed
	public class TutorialService
	{
		private static List<String> lst = new List<String>
		(new String[] {"Arrays","Queues","Stacks"});

步骤6) 定义我们的 GET 方法的代码。
接下来,我们将定义 GET 方法的代码。此代码也将驻留在同一个 TutorialService.svc 文件中。每当我们从浏览器调用服务时,此代码都会运行。

以下方法将用于实现下面提到的场景

  • 如果用户想要所有可用教程的列表,则需要编写以下代码来实现。

创建 Restful Web 服务

[WebGet(UriTemplate="/Tutorial")]

public String GetAllTutorial()
{
	int count = 1st.Count;
	String TutorialList = "";
	for (int i = 0; i < count; i++)
	TutorialList = TutorialList + lst[i] + ",";
	return TutorialList;
}

代码说明:-

  1. 第一行代码是最重要的。它用于定义我们如何通过 URL 调用此方法。因此,如果我们的 Web 服务的链接是 http://localhost:52645/TutorialService.svc 如果我们将“/Tutorial”附加到 URL 中,则 http://localhost:52645/TutorialService.svc/Tutorial ,上面的代码将被调用。'WebGet' 属性是一个参数,它允许此方法成为 RESTful 方法,以便可以通过 GET 动词调用它。
  2. 这段代码用于遍历“lst”变量中的字符串列表并将它们全部返回给调用程序。

步骤7) 返回输出。
下面的代码确保如果使用教程 id 对教程服务进行 GET 调用,那么它将根据教程 id 返回相应的教程名称。

创建 Restful Web 服务

[WebGet (UriTemplate = "/Tutorial/{Tutorialid}")]

public String GetTutorialbyID(String Tutorialid)
{
	int pid;
	Int32.TryParse(Tutorialid, out pid);
	return lst[pid];
}

代码说明:-

  1. 第一行代码是最重要的。它用于定义我们如何通过 URL 调用此方法。因此,如果我们的 Web 服务的链接是 http://localhost:52645/TutorialService.svc 如果我们在 URL 后面附加 '/Tutorial/{Tutorialid}',那么我们就可以这样调用 Web 服务 http://localhost:52645/TutorialService.svc/Tutorial/1 作为示例。然后,Web 服务需要返回具有教程 ID#1 的教程名称。
  2. 此段代码用于返回传递给 Web 方法的教程 ID 的“教程名称”。
  • 默认情况下,需要记住的是,传递给浏览器中的 URL 的任何东西都是字符串。
  • 但是你必须记住,我们列表的索引必须是一个整数,所以我们添加必要的代码,首先将 Tutorialid 转换为整数,然后使用它来访问列表中的索引位置,然后
  • 然后将值相应地返回给调用程序。

步骤8) 编写 POST 方法的代码。
下一步是编写 POST 方法的代码。每当我们想通过 POST 方法将字符串值添加到教程列表中时,都会调用此方法。例如,如果您想添加“软件测试”教程名称,则需要使用 POST 方法。

创建 Restful Web 服务

代码说明:-

  1. 第一行是附加到我们方法的“WebInvoke”属性。这允许通过 POST 调用来调用该方法。RequestFormat 和 ResponseFormat 属性必须以 JSON 格式提及,因为当将值发布到 RESTFul Web 服务时,值必须采用这种格式。
  2. 第二行代码用于将通过 POST 调用传递的字符串值添加到我们现有的教程字符串列表中。

步骤9) 添加方法来处理 DELETE 操作。
最后,我们将添加方法来处理 DELETE 操作。每当我们想通过 DELETE 方法从教程列表中删除现有字符串值时,都会调用此方法。

创建 Restful Web 服务

[WebInvoke(Method = "DELETE", RequestFormat = WebMessageFormat.Json,
	UriTemplate = "/Tutorial/{Tutorialid}", ResponseFormat = WebMessageFormat.Json,
	BodyStyle = WebMessageBodyStyle.Wrapped)]
	
public void DeleteTutorial(String Tutorialid)
{
	int pid;
	Int32.TryParse(Tutorialid, out pid);
	1st.RemoveAt(pid);
}

代码说明:-

  1. 第一行是附加到我们方法的“WebInvoke”属性。这允许通过 POST 调用来调用该方法。RequestFormat 和 ResponseFormat 属性必须以 JSON 格式提及,因为当将值发布到 RESTFul Web 服务时,值必须采用这种格式。请注意,Method 参数设置为“DELETE”。这意味着每当我们发出 DELETE 动词时,都会调用此方法。
  2. 第二行代码用于获取通过 DELETE 调用发送的 Tutorialid,然后从列表中删除该 id。( Int32 代码中的函数用于将教程 ID 从字符串变量转换为整数)。

运行您的第一个 Restful Web 服务

现在我们已经在上一节中创建了整个 Web 服务。让我们看看如何运行 Tutorial 服务,以便可以从任何客户端调用它。

要运行 Web 服务,请按照以下步骤操作

步骤1) 右键单击项目文件 - Webservice.REST

运行 Restful Web 服务

步骤2) 选择菜单选项“设置为启动项目”。这将确保当 Visual Studio 运行整个解决方案时运行此项目

运行 Restful Web 服务

步骤3) 下一步是运行项目本身。现在,根据系统上安装的默认浏览器,Visual Studio 中的运行按钮旁边将显示相应的浏览器名称。在我们的例子中,我们有 Google Chrome 出现。只需单击此按钮即可。

运行 Restful Web 服务

输出:-

当项目运行时,您可以浏览到 TutorialService.svc/Tutorial 部分,您将获得以下输出。

运行 Restful Web 服务

在上面的输出中,

  • 您可以看到浏览器正在调用“GET”动词并执行 Web 服务中的“GetAllTutorial”方法。此模块用于显示我们的 Web 服务公开的所有教程。

测试您的第一个 Restful Web 服务

在以上部分中,我们已经了解了如何使用浏览器执行“GET”动词并调用“GetAllTutorial”。

  1. 现在让我们使用浏览器执行以下用例场景。

GET Tutorial/Tutorialid – 当客户端调用此 Restful API 时,将根据客户端发送的 Tutorialid 为其提供 Tutorial 名称

在浏览器中,在 URL 中的 Tutorial 单词后附加字符串 /1。如果按下 Enter 键,您将获得以下输出

测试 Restful Web 服务

现在您将看到 Queues 的输出,它实际上对应于我们的教程字符串列表中的数字 1。这意味着现在正在从我们的 Web 服务调用“GetTutorialbyID”方法。它还显示 1 的值已通过浏览器成功传递到我们的 Web 服务和我们的方法,这就是我们在浏览器中获得“Queues”正确对应值的原因。

  1. 接下来,让我们通过执行以下场景来使用我们的 Web 服务。为此,您需要安装名为“Fiddler”,这是一个可从该网站免费下载的工具。

POST Tutorial/Tutorialname – 当客户端调用此 Restful API 时,客户端将提交插入 Tutorialname 的请求。然后,Web 服务会将提交的 Tutorial 名称添加到集合中。

运行 Filddler 工具并执行以下步骤;

  1. 转到编写器部分。这用于创建可提交给任何 Web 应用程序的请求。
  2. 确保请求类型为“POST”,并且命中正确的 URL,在我们的例子中应该是 http://localhost:52645/TutorialService.svc/Tutorial
  3. 确保 Content-Type 标记为 application/json。请记住,我们 Web 服务中的 POST 请求方法仅接受 json 样式的数据,因此我们需要确保在向应用程序发送请求时指定这一点。
  4. 最后,我们需要输入数据。请记住,我们的 POST 方法接受一个名为“str”的参数。因此,我们在这里指定要将一个名为“Trees”的值添加到我们的教程名称集合中,并确保将其标记为 str 变量名称。

最后,只需单击 Fiddler 中的“执行”按钮即可。这将向 Web 服务发送请求,以将数据“Trees”发布到我们的 Web 服务。

测试 Restful Web 服务

现在,当我们浏览教程 URL 以显示教程列表中的所有字符串时,您将看到“Trees”的值也存在。这表明对 Web 服务的 POST 请求已成功执行,并且已成功添加到我们的教程列表中。

测试 Restful Web 服务

  1. 接下来,让我们通过执行以下场景来使用我们的 Web 服务。为此,我们还需要使用 Fiddler 工具

DELETE Tutorial/Tutorialid- 当客户端调用此 Restful API 时,客户端将根据 Tutorialid 提交删除 Tutorialname 的请求。然后,Web 服务将从集合中删除已提交的 Tutorial 名称。

运行 Filddler 工具并执行以下步骤

  1. 转到编写器部分。这用于创建可提交给任何 Web 应用程序的请求。
  2. 确保请求类型为“DELETE”,并且命中正确的 URL,在我们的例子中应该是 http://localhost:52645/TutorialService.svc/Tutorial确保用于删除列表中的字符串的 id 通过 URL 作为参数发送。在我们的 REST 示例中,我们发送 1,因此这将删除 2nd 我们的集合中的一个元素是“队列”。

最后,只需单击 Fiddler 中的“执行”按钮。这将向 Web 服务发送请求以删除到我们的 Web 服务的数据“队列”。

测试 Restful Web 服务

现在,当我们浏览到教程 URL 以显示教程列表中的所有字符串时,您会注意到“Queues”的值不再存在。

这表明对 Web 服务的 DELETE 请求已成功执行。我们的 Tutorial 字符串列表中索引号为 1 的元素已成功删除。

测试 Restful Web 服务

结语

  • REST 代表表述性状态转移。REST 用于构建轻量级、可维护且可扩展的 Web 服务。
  • 越来越多的应用程序正在转向 Restful 架构。这是因为现在有很多人使用移动设备,并且越来越多的应用程序正在转向云端。
  • REST 的主要方面是驻留在服务器上的资源以及可用于处理这些资源的 GET、POST、PUT 和 DELETE 动词。
  • Visual Studio 和.Net 可用于创建 Restful Web 服务。
  • 在规划婴儿食品行业的工艺要求时,安全性和可靠性是工艺设计中最重要的方面。 测试与验证 web 服务的 POST 和 PUT,您需要使用另一个名为 fiddler 的工具,它可用于将 POST 和 PUT 请求发送到服务器。