30

我需要在服务器端创建 5 个方法来处理二进制数据。远程客户端是小程序和 JavaScript。客户端将向服务器发送文件,服务器必须解析这些文件,然后以 XML/JSON 的形式返回响应。

所以我很困惑 - 在这种情况下使用 REST 服务是一种好习惯吗?还是我应该使用 servlet?

我的同事告诉我:

“创建仅由一个应用程序使用的 REST 服务是不好的。只有在许多应用程序使用时才必须创建 REST。REST 与 servlet 相比有一些缺点:REST 比 servlet 慢;更难编写比 servlet 更安全的 REST”

但是,我看到使用 Servlet 的一些缺点:我需要发送一个我想调用的函数名(即作为额外的 HTTP 参数发送函数名),然后在doPost方法内部执行以下切换:

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

}

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

4

7 回答 7

46

您在这里混淆了两种范式:

  • REST 是一种软件架构“风格”;
  • Servlet 是一种服务器端技术。

例如,您可以使用 Servlet 实现类似 REST 的服务。

于 2012-09-21T07:11:34.980 回答
29

好吧,我不同意您的同事的意见,即仅由一个应用程序使用 rest 是不好的,因为您将来可能会决定让不同的应用程序使用相同的 rest api。如果我是你,我会选择纯 REST。为什么?

  1. 如果您使用一些框架来实现休息(比如说apache cxfjersey),您会得到很多开箱即用的东西 - 您编写 POJO 您会得到休息,您可以获得序列化和反序列化,例如 JSON 对象开箱即用(最终您将需要实现一些 JsonProviders,但这没什么大不了的)。

  2. 工作起来很直观(如果您设计好其余 API)。

  3. JavaScript 客户端非常容易使用(特别是如果您使用 JQuery 或类似的东西)

但是,这在很大程度上取决于您到底想做什么,如果您有一些强大的事务逻辑,其余的可能会非常棘手。如果您只打算执行 POST 请求(不使用其他 HTTP 方法),您可能希望使用 Servlet,因为您不必使用其他框架并产生更多依赖项。请注意,REST 或多或少是一个架构概念,它与 Servlet 技术并不矛盾,如果您足够固执,您可以仅使用 servlet 制作一个 REST API :-)。希望我有所帮助。

于 2012-09-21T07:36:38.733 回答
4

首先,你说的是两种不同的范式。这有点像苹果和橘子。

REST 是一种服务风格,它使用 HTTP 操作(GET、PUT 等)来读取和写入资源的状态。将资源视为“名词”和“事物”。

另一方面,Servlet 是 Sun Microsystems 最初提供的一种软件规范,用于将 HTTP 请求连接到自定义 Java 代码。Servlet 经常用方法调用来说话:“动词”和“动作”。

由于您的问题暗示您正在寻求处理输入->输出方法,因此只需一个普通的 servlet 就可以完成这项工作。

于 2014-01-19T17:42:03.710 回答
3

我在使用 Jersey 和创建 REST 服务时看不到任何问题。我知道我是一个 REST 塔利班人,但是使用 JAX-RS 实现这种架构真的很简单,所以......为什么不呢?

您的同事说:“只有在许多应用程序使用它时才必须创建 REST”,但我不明白这是怎么回事。为什么我不能为单个应用程序创建 REST 服务?

于 2012-09-21T07:31:33.660 回答
2

听起来你的同事正在应用过早的优化。如果您可以使用 JAX-RS 库快速编写它,那么就这样做......如果它被证明是瓶颈,那么您是否花时间将其重写为 servlet。

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

于 2012-09-21T08:51:10.643 回答
1

根据您的容器版本,Jersey(或任何其他 JAX-RS 实现)仍将使用 Servlet 将请求分派到适当的处理程序。

如果您的应用程序是真正的 RESTful,那么 JAX-RS 将满足您的需求。否则,请考虑使用 FrontController 来解释请求并将其转发给适当的处理程序。

另外,不要将 XML 或 JSON 与 REST 混淆。您将在大多数(如果不是全部)JAX-RS 实现中免费获得这些,但这些实现仍将内容编组委托给其他库(例如 JAXB)。

于 2012-09-21T07:25:48.700 回答
1

这是类似的链接。他用简单的servlet http://software.danielwatrous.com/restful-java-servlet/

于 2013-08-08T06:14:37.443 回答