Can I use TCP in a RESTful service?

20

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

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


3
我从未听说过REST的“原则”是为了使其更加高效。 - John Saunders
6个回答

30

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


4
您只能使用HTTP协议来使用REST。 - Darin Dimitrov
1
REST 是否完全依赖于 HTTP? - MBen
1
@MBen 是的,完全正确。 - GameScripting
1
@GameScripting 我对REST和HTTP都很陌生,但我读到过REST与HTTP无关,只是恰好HTTP符合或很好地适应了REST的要求 :-) - MBen
3
理论上你是正确的。REST只是访问资源的一种思想。实际上,它只与HTTP一起使用。如果有人谈论REST,那么他/她肯定是在谈论HTTP。 - GameScripting
显示剩余2条评论

15

REST是一种架构风格(或者一组限制条件),HTTP恰好可以轻松地匹配这些限制条件。而且,很多HTTP/1.1基础设施已经支持它:服务器、代理、缓存、客户端库、解析器等等。就像这样:

HTTP和REST的关系

系统是否可以从零开始构建为RESTful并不依赖于HTTP呢?当然可以。来自该主题权威来源Roy Fielding本人的说法:

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

如果你阅读了那篇文章或者事实上是Roy的博士论文,你会意识到,如果你尝试遵循所有的限制条件,你最终会得到一个看起来和行为几乎与现代HTTP相似的东西,但它可能缺乏HTTP拥有的大部分基础设施支持。因此,问题是:这值得吗?

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


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中借鉴来的。因此,如果您遵循REST原则,则意味着您正在遵循HTTP原则。
话虽如此,如果您不想使用HTTP,则客户端和/或服务器都必须理解HTTP说的相同语言。例如,它使用诸如GET、POST、PUT等动词以及响应代码,例如200、300、400等。因此,您的服务器需要了解如何响应请求,例如...employee/22,并返回:
1. 200 OK、301永久移动、500等... 2. 内容类型 3. 其他所需的标头
您的客户端还需要了解这些标头,以便能够向服务器发送请求并消耗来自服务器的响应。
如果您实现了所有这些,还有安全性(身份验证和授权等)、缓存等等,您会意识到您只是在尝试重新发明轮子:HTTP。
这值得吗?您确定性能瓶颈是HTTP协议还是后端代码、对数据库的查询等吗?

1

正如Darin已经回答的那样,HTTP是一种带有一些开销的TCP协议,恰好是RESTful定义中使用的内容。因此,不,你不能去除HTTP的开销。

我认为你的问题“我可以使用TCP来打造更快的RESTful应用吗?”与问题“为什么这么多网站使用REST,而HTTP比纯TCP慢?”有关。

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

例如:GET /posts?userId=5

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


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。

你可以完全在WCF中创建基于REST的服务,它们甚至有像WebGet这样的属性专门用于此目的。这个答案不是事实性的,而是主观的。 - CodingYoshi

0

对于基于Rest的服务,您不能使用Http以外的其他绑定。这是因为Rest是一种根据某些原则构建的架构风格。其中一个原则是利用Web的无状态协议,即Http,它还希望使用诸如Get、Port、Put和Delete等Http单词,而这些单词在TCP协议中不可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接