REST利用当前Web的特性并在其上应用一些原则,使其更加高效。它使用标准的HTTP动词进行通信,并利用其无状态特性。
然而,REST服务是否可以使用TCP协议进行通信?如果可以,那么它是否会违反其原则?
HTTP是基于TCP/IP协议的。因此,当您使用REST时,已经在使用TCP进行通信。但是,如果您想在没有HTTP的情况下使用纯TCP套接字进行REST,则不行,因为REST基于HTTP动词和标头。这些概念仅存在于HTTP协议中。
REST是一种架构风格(或者一组限制条件),HTTP恰好可以轻松地匹配这些限制条件。而且,很多HTTP/1.1基础设施已经支持它:服务器、代理、缓存、客户端库、解析器等等。就像这样:
系统是否可以从零开始构建为RESTful并不依赖于HTTP呢?当然可以。来自该主题权威来源Roy Fielding本人的说法:
REST API不应依赖于任何单一的通信协议。
如果你阅读了那篇文章或者事实上是Roy的博士论文,你会意识到,如果你尝试遵循所有的限制条件,你最终会得到一个看起来和行为几乎与现代HTTP相似的东西,但它可能缺乏HTTP拥有的大部分基础设施支持。因此,问题是:这值得吗?
另外,如果您看一下现有的大多数RESTful服务,它们很少是完全的REST服务。这就是为什么它们称自己为“RESTful服务”,而不是“REST服务”。顺便说一下,该网站的API非常接近完全的REST实现。
正如Darin已经回答的那样,HTTP是一种带有一些开销的TCP协议,恰好是RESTful定义中使用的内容。因此,不,你不能去除HTTP的开销。
我认为你的问题“我可以使用TCP来打造更快的RESTful应用吗?”与问题“为什么这么多网站使用REST,而HTTP比纯TCP慢?”有关。
事实上:HTTP确实比纯二进制TCP形式慢,但在大多数应用程序中,用户不会注意到差异,因为开销非常小,通常客户端每分钟只会发出少量请求。
例如:GET /posts?userId=5
如果这个请求需要超过几毫秒才能完成,那么问题不在HTTP协议上。性能问题与网络延迟、服务器端代码或从数据库检索数据的方式有关。
有些微妙的区别:
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);
}
WebGet
这样的属性专门用于此目的。这个答案不是事实性的,而是主观的。 - CodingYoshi对于基于Rest的服务,您不能使用Http以外的其他绑定。这是因为Rest是一种根据某些原则构建的架构风格。其中一个原则是利用Web的无状态协议,即Http,它还希望使用诸如Get、Port、Put和Delete等Http单词,而这些单词在TCP协议中不可用。