18

REST 正在使用 Web 的当前特性,并在其上应用一些原则以提高其效率。它使用标准的 HTTP 动词进行通信,并利用其无状态特性。

但是,REST 服务是否可以使用 TCP 协议进行通信?如果是,那么它会违反其原则吗?

4

6 回答 6

27

HTTP 是基于 TCP/IP 的协议。因此,当您使用 REST 时,您已经在使用 TCP 进行通信。但是,如果您想在纯 TCP 套接字上使用 REST,而不使用 HTTP,那么不,这没有意义,因为 REST 基于 HTTP 动词和标头。这些概念只存在于 HTTP 协议中。

于 2012-12-26T09:13:44.040 回答
11

REST 是一种架构风格(或一组约束)。碰巧 HTTP 可以轻松匹配所有这些约束。除此之外,还有很多 HTTP/1.1 基础设施已经支持它:服务器、代理、缓存、客户端库、解析器等。像这样的东西:

HTTP 和 REST 关系

系统可以从头开始构建为 RESTful 且不依赖 HTTP 吗?当然。来自Roy Fielding 本人的权威来源:

REST API 不应依赖于任何单一的通信协议。

如果你阅读了这篇文章或者实际上是Roy 的论文,你会意识到,如果你尝试遵循所有的限制,你最终会得到一些看起来和行为都非常像现代 HTTP 的东西,尽管它可能缺乏大多数基础设施支持HTTP 有。因此,问题是:值得吗?

此外,如果您查看大多数 RESTful 服务,它们很少是完全 REST 服务。这就是为什么他们称自己为“RESTful 服务”,而不是“REST 服务”。顺便说一句,该站点的 API 非常接近于完整的 REST 实现。

于 2019-09-25T12:49:40.117 回答
2

但是,REST 服务是否可以使用 TCP 协议进行通信?如果是,那么它会违反其原则吗?

简答

不,如果您根据 REST 原则编写它,它不会违反它的原则。是的,如果您不遵循 REST 原则,它将违反其原则。您在客户端和服务器端的代码必须遵守 REST 规则。例如,如果我向“...employee/22”发送一个“GET”,它最好向我发送一个 REST 响应,例如 200、标头和内容类型等。所有这些基本上都是 HTTP 所做的。


长答案

您的问题的答案由@ГеоргиКременлиев 提供。我实际上认为这可能是唯一正确的答案。

确实,REST 主要与 HTTP 相关联,当人们谈论 REST 时,他们正在谈论 HTTP。但是,“大部分”并不意味着“总是”,即使它是“总是”,也不意味着没有 HTTP 就不可能实现 REST,这在@ГеоргиКременлиев 答案的链接中指出。HTTP 运行良好(客户端和服务器),采用这些原则来创建具有这些原则的任何客户端/服务器应用程序,因此它们可以享受与 HTTP 相同的好处。换句话说,

  1. 任何客户端都可以设计为理解 REST(例如,浏览器理解 REST)
  2. 任何服务器都可以设计为理解 REST(例如,Web 服务器理解 REST)

这里有一点很重要,REST 原则是从 HTTP 借来的。因此,如果您是 RESTful,则意味着您遵循 HTTP 原则。

话虽如此,如果您不想使用 HTTP,那么您的客户端和/或服务器都必须理解 HTTP 所说的相同语言。例如,它使用 GET、POST、PUT 等动词和 200、300、400 等响应代码。因此,您的服务器需要了解如何响应诸如...employee/22之类的请求并返回:

  • 200 OK,301 永久移动,500 等等...
  • 内容类型
  • 需要其他标题

您的客户端还需要了解这些标头才能向服务器发送请求并使用来自服务器的响应。

如果你确实实现了所有这些、安全性(身份验证和授权等)、chaching 和列表继续,你会意识到你只是在尝试重新发明轮子:HTTP。

这值得吗?您确定性能瓶颈是 HTTP 协议还是您的后端代码、对数据库的查询等?

于 2019-12-16T20:28:58.207 回答
1

正如 Darin 已经回答的那样,HTTP 是一种 TCP 协议,有一些开销,这正是 RESTful 定义中使用的。所以,不,你不能消除 HTTP 开销。

我相信您的问题“我可以将 TCP 用于更快的 RESTful 应用程序吗? ”与“如果 HTTP 比纯 TCP 慢,为什么这么多网站都使用 REST ?”这个问题有关。

事实是:HTTP 确实比纯二进制 TCP 形式慢,但在大多数应用程序中,您的用户不会注意到差异,因为开销非常小,通常客户端每分钟只会发出几个请求。

例如:GET /posts?userId=5

如果这个请求需要超过几毫秒才能完成,那么问题不在于 HTTP 协议。性能问题与网络延迟、服务器端代码或从数据库中检索数据的方式有关。

于 2015-09-05T21:57:55.313 回答
1

角度略有不同:

1. 不要使用 WCF 创建基于 REST 的服务。使用 Asp.Net WebAPI。

2. 只是为了好玩:如果您想使用具有“REST”原则的 WCF TCP 绑定,也许您可​​以创建一个基于“资源”的无状态 API,而不是像一个典型的 RPC。

[ServiceContract]
interface RestApi
{
    Result Get(string id);
    Result Post(string id, Resource resource);
    Result Put(string id, Resource resource);
    void Delete(string id);
}

这样您就不必为每项服务定义不同的合同,而只需针对不同的交互调整您的资源。

注意:我不建议任何人这样做:这是在重新发明轮子。如果需要 REST,请使用 WebAPI。

于 2015-09-05T23:18:48.457 回答
0

您不能将 Http 之外的其他绑定用于基于 Rest 的服务。这是因为 Rest 是一种基于一定原则的建筑风格。这个原则之一是借助 web 的无状态协议 http,它还希望使用 TCP 协议不可用的 Http 字词,例如 Get、Port、Put 和 Delete

于 2012-12-26T13:38:03.273 回答