我需要在服务器端创建5个方法,这将使用二进制数据。远程客户端是applet和JavaScript。客户端将文件发送到服务器,服务器必须解析这些文件,然后将响应作为XML / JSON返回。
所以我很困惑 - 在这种情况下使用REST服务是一种好习惯吗?或者我应该使用servlet?
我的同事告诉我:
“创建仅由一个应用程序使用的REST服务不是 好。只有在许多应用程序使用REST时,才能创建REST。和 REST比servlet有一些缺点: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更方便。
答案 0 :(得分:37)
你在这里混淆了两个范例:
例如,您可以使用Servlet实现类似REST的服务。
答案 1 :(得分:25)
那么, 我不同意你的同事的意见,只有一个应用程序休息是不好的,因为你可能决定将来使用相同的rest api进行不同的应用程序。如果我是你,我会选择纯REST。为什么呢?
如果你正在使用一些框架进行休息实现(让我们说apache cxf或jersey)你会得到很多开箱即用的东西 - 你写POJO你得到休息,你得到序列化和反序列化,比方说来说,开箱即用的JSON对象(最终你需要实现一些JsonProviders,但这不是什么大问题。)
工作直观(如果您设计好其他API)。
JavaScript客户端非常容易使用(特别是如果你使用的是JQuery或类似的东西)
但是,它很大程度上取决于你想要做什么,如果你有一些强大的事务逻辑,其余的可能会非常棘手。如果您只打算执行POST请求(不使用其他HTTP方法),您可能希望使用Servlet,因为您不必使用其他框架并创建更多依赖项。请注意,REST或多或少是一个体系结构概念,它与Servlet技术并不矛盾,如果你足够顽固,你只能使用servlet进行休息api :-)。 希望我帮了。
答案 2 :(得分:4)
首先,你说的是两种不同的范例。这有点像苹果和橘子。
REST是一种使用HTTP操作(GET,PUT等)来读取和写入资源状态的服务样式。将资源视为“名词”和“事物”。
另一方面,Servlet是Sun Microsystems最初提供的用于将HTTP请求连接到自定义Java代码的软件规范。 Servlet经常用方法调用来说:“动词”和“动作”。由于您的问题意味着您正在寻求处理input->输出方法,因此只需要一个普通的servlet来完成这项工作。
答案 3 :(得分:3)
我在使用Jersey和创建REST服务时看不到任何问题。我知道我是一个REST-taliban,但使用JAX-RS实现这种架构非常简单,所以......为什么不呢?
你的同事说:“只有在许多应用程序使用REST时才能创建REST”,但我看不出这是怎么回事。为什么我不能为单个应用程序创建REST服务?
答案 4 :(得分:2)
听起来你的同事正在应用过早的优化。如果您可以快速使用JAX-RS库编写它,那么这样做......如果它被证明只是瓶颈,那么您是否需要花时间重写为servlet。
根据我的经验,JAX-RS的性能开销不足以证明直接在servlet中编写等效项的开发和维护开销,其中问题很好地映射到JAX-RS
答案 5 :(得分:1)
根据您的容器版本,Jersey(或任何其他JAX-RS实现)仍将使用Servlet将请求分派给相应的处理程序。
如果您的应用程序真的是RESTful,那么JAX-RS将按您的需要进行操作。否则,请考虑使用FrontController来解释请求并将其转发到适当的处理程序。
另外,不要将XML或JSON与REST混淆。您将在大多数(如果不是全部)JAX-RS实现中免费获得这些,但这些实现仍然将内容编组委托给其他库(例如JAXB)。
答案 6 :(得分:1)
这是类似的链接。他用简单的servlet完成了它 http://software.danielwatrous.com/restful-java-servlet/