我可以在RESTful服务中使用TCP吗?

时间:2012-12-26 09:11:30

标签: c# .net wcf rest

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

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

6 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:2)

角度略有不同:

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

2。只是为了好玩:如果你想使用WCF TCP绑定' REST'在考虑原则的情况下,也许您可​​以基于“资源”来创建无状态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。

答案 2 :(得分:2)

REST是一种体系结构样式(或一组约束)。碰巧的是,HTTP可以轻松匹配所有这些约束。除此之外,许多HTTP / 1.1基础结构已经支持它:服务器,代理,缓存,客户端库,解析器等。

HTTP and REST relationship

能否从头开始构建系统以实现RESTful并且不依赖HTTP?当然。来自有关主题Roy Fielding himself的权威信息:

  

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

如果您阅读该文章,或者实际上是Roy's dissertation,您将意识到,如果尝试遵循所有约束条件,最终可能会得到外观和行为与现代HTTP相似的东西,尽管它可能缺少HTTP具有的大多数基础结构支持。因此,问题是:值得吗?

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

答案 3 :(得分:1)

由于Darin已经answered,HTTP是一种TCP协议,其开销与RESTful定义中使用的开销完全相同。所以,不,你不能删除HTTP开销。

我相信你的问题" 我可以使用TCP来获得更快的RESTful应用吗?"与问题相关" 如果HTTP比纯TCP慢,为什么有这么多网站使用REST?"。

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

例如:GET /posts?userId=5

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

另一方面,如果您的客户端代码每分钟发出数千个请求,那么这个单个客户端会注意到与HTTP开销相关的性能问题。在这种情况下,您可以在一次操作中批量处理多个操作,并减少网络请求的数量。

如果单个客户端确实需要每分钟发出数千个请求,那么您可以考虑避免使用REST并开始寻找其他方法。请记住,SOAP可以使用TCP绑定,但请求也有解析XML的开销。此外,SOAP是有状态的,HTTP是无状态的。对于可伸缩性而言,有状态的方法更糟糕。

答案 4 :(得分:0)

除了基于Rest服务的Http之外,您不能使用其他绑定。这是由于休息是一种基于某种原则的建筑风格。其中一个原则是借助http的无状态协议,也需要使用在TCP协议中不可用的Get,Port,Put和Delete等Http字样

答案 5 :(得分:0)

  

但是,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好,301永久移动,500等...
  • 内容类型
  • 需要其他标头

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

如果您确实实现了所有这一切,并且实现了安全性(身份验证和授权等),并且进行了高速缓存,并且清单不胜枚举,您将意识到您只是在尝试重新发明轮子:HTTP。

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