Servlet与REST的区别

31

我需要在服务器端创建5个方法,这些方法将与二进制数据一起使用。远程客户端是applet和JavaScript。客户端将向服务器发送文件,服务器必须解析这些文件,然后将响应作为XML / JSON返回。

所以我有些困惑 - 在这种情况下使用REST服务是否是一个好的实践?还是应该使用servlet?

我的同事告诉我:

"为仅被一个应用程序使用而创建REST服务不是好的做法。只有当它将被许多应用程序使用时才应该创建REST。 REST比servlet慢;编写线程安全的REST比servlet更困难"

然而,我认为使用Servlet也存在一些缺点:我需要发送要调用的函数名(即作为额外的HTTP参数发送函数名),然后在doPost方法中执行以下切换:

switch(functionName) {
 case "function1":
   function1(); 
   break;
 case "function2"
   function2(); 
   break;
//.... more `case` statements....

}

在REST的情况下,我可以为不同的功能使用不同的URL,这更加方便。此外,在REST的情况下,从服务器返回JSON/XML更加方便。


1
了解更多关于REST服务的信息,请参考此链接[Rest - Service](http://www.mkyong.com/tutorials/jax-rs-tutorials/) - Nagaraj
3
你的同事可能不理解 REST 是什么。正如在这里的其中一个答案中提到的那样,REST 是一种架构风格。像“REST 比 Servlet 慢;只有在将被多个应用程序使用时才需要创建 REST”这样的说法是显然错误的。请留意不要改变原意,我会尽力让翻译更加易懂。 - asgs
@asgs 抱歉,我在谈论 RESTful(Web 服务),关于使用 REST 的具体实现 - Jersey 库。所以说 RESTful Web 服务比 Servlet 慢是不正确的吗? - WelcomeTo
1
我进行了大量的研究,构建了演示应用程序,培训了他人并编写了详细笔记。如果您从零开始学习,请查看我的Github笔记,以获取完整的概述:https://github.com/manoharreddyporeddy/my-programming-language-notes/blob/master/my-java/src/web-services/README.MD - Manohar Reddy Poreddy
7个回答

48
你在混淆两个概念:
  • REST是一种软件体系结构“风格”;
  • Servlet是一种服务器端技术。
例如,你可以使用Servlet实现类似REST的服务。

是的,我了解它们之间的差异。我知道REST是在Servlets之上构建的,但我谈论具体的技术(HTTPServlet和一些REST实现(例如Jersey))。 - WelcomeTo
3
如果使用Servlet实现REST风格的服务,我需要为每个URL创建一个Servlet。但是,如果使用REST服务(Jersey),我只需要创建一个类即可。 - WelcomeTo
那我建议您更新您的问题以反映这一点,因为目前很不清楚。 - Sébastien Le Callonnec
好的,我会更新问题。那么你对我的问题有什么看法?创建REST服务是正确的选择吗?还是在这种情况下创建Servlet更好? - WelcomeTo
能否在HTML网页中用“RestFul Webservices”替换“Servlets”?从性能角度来看,哪个更好? - Hosein Aqajani

29

嗯,我不同意你的同事认为仅由一个应用程序使用rest不好的观点,因为你未来可能会决定让不同的应用程序使用相同的rest api。 如果是我,我会选择纯REST。 为什么呢?

  1. 如果您正在使用某个框架进行rest实现(比如apache cxfjersey),您可以直接使用大量的内容 - 您编写POJO,您就拥有了一个rest,您可以轻松获取序列化和反序列化,例如 JSON对象等(最终您需要实现一些JsonProviders,但这并不是什么大问题)。

  2. 如果您设计了良好的rest API,则非常直观易用。

  3. 非常容易被JavaScript客户端使用(特别是如果您正在使用JQuery或类似工具)。

但是,这严重取决于您想要做什么,如果您有一些强有力的事务逻辑,则rest可能会变得相当棘手。 如果您仅打算执行POST请求(而不使用其他HTTP方法),则可能希望使用Servlet,因为您无需使用附加框架并增加更多依赖项。 请注意,REST在很大程度上是一种架构概念,它并不与Servlet技术相矛盾,如果您足够固执,您可以仅使用servlets创建rest api :-)。希望我对您有所帮助。


如果您只需要进行POST请求(而不使用其他HTTP方法),那么您可能希望使用Servlet(例如JSON over RPC),因为您不必使用其他框架(如Jersey或Apache CXF)并增加更多依赖项。 - sactiw

5
首先,你在谈论两种不同的范式。这有点像是苹果和橙子之间的区别。
REST是一种服务风格,使用HTTP操作(GET、PUT等)来读取和写入资源的状态。将资源视为“名词”和“物品”。
另一方面,Servlet是一个软件规范,最初由Sun Microsystems提供,用于将HTTP请求连接到自定义Java代码。Servlet通常使用方法调用来交流:“动词”和“行动”。
由于你的问题暗示着你要处理输入-输出方法,只需一个普通的Servlet就可以完成工作。

3
我认为使用Jersey创建REST服务并没有任何问题。我知道我是一个“REST-塔利班”,但是使用JAX-RS实现这种架构真的很简单,所以...为什么不呢?
你的同事们说:“只有在多个应用程序使用时才必须创建REST服务”,但我不明白这是怎么回事。为什么我不能为单个应用程序创建REST服务?

2

听起来你的同事正在进行过早的优化。如果可以使用JAX-RS库快速编写,请这样做...只有当它被证明是瓶颈时,才需要花时间重写为servlet。

根据我的经验,在问题很好地映射到JAX-RS的情况下,JAX-RS的性能开销不足以证明直接编写等效的servlet的开发和维护开销。


1

1
根据您的容器版本,Jersey(或任何其他JAX-RS实现)仍将使用Servlet将请求分派到适当的处理程序。
如果您的应用程序真正符合RESTful,则JAX-RS将按照您的要求执行。否则,请考虑使用FrontController来解释请求并将其转发到适当的处理程序。
此外,请不要将XML或JSON与REST混淆。在大多数(如果不是全部)JAX-RS实现中,您将免费获得这些内容,但这些实现仍将内容编组委托给其他库(例如JAXB)。

是的,我使用的是不支持JEE 6的WAS 7。而且我将使用不是真正的JAX_RS,我将使用Jersey实现。那么你建议我在这种情况下使用servlet吗? 我知道Jersey是基于Servlet构建的。但我认为在有多个方法的情况下使用REST更方便? - WelcomeTo
Jersey是JAX-RS的参考实现。我不知道你的应用程序是否符合RESTful标准。你考虑过Spring MVC吗? - David Grant
我不能使用Spring(这是我的老板的决定,所以我无能为力),只能使用Java EE。 “我不知道你的应用程序是否符合RESTful标准。” - 我不明白你的意思。我很困惑该使用RESTful还是Servlet。 - WelcomeTo
正如Sébastien Le Callonnec所说,REST是一种架构风格。听起来你把REST和任何通过HTTP传输的东西混淆了。 - David Grant
抱歉,我谈论的是RESTful(Web服务),而不是REST风格。那么,在WAS 7上,我更喜欢使用FrontController还是RESTful?由于WAS 7不支持JAX-RS本地化。 - WelcomeTo
RESTful 描述了符合 REST 风格的应用程序。从问题中我无法告诉你你的应用程序是否符合 RESTful。如果你根据参数改变你的操作,那么 REST 不适合你,我建议编写一个简单的前端控制器。 - David Grant

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