【问题标题】:Why use a framework for RESTful services in Java instead of vanilla servlets为什么在 Java 中使用 RESTful 服务框架而不是普通 servlet
【发布时间】:2012-02-14 20:40:43
【问题描述】:

我知道有一些关于可用于在 Java 中执行 RESTful 服务的库的问题,但是将它们用于原始实现的价值是什么。我的意思是,如果我想创建 the url structure described by Wim

  • www.example.com/images
  • www.example.com/images/id/num
  • www.example.com/images/tag/num
  • www.example.com/images/tag/num/num/num

将 url 模式 /images 映射到 servlet 并使用一两行解析 url 的参数而不是学习、实现和配置这些库之一来为您完成。

基本上我要问的是...使用 RESTful Java 框架有什么价值?对于一个简单的问题,在实现中不会增加很多复杂性吗?

编辑:这个球衣代码处理得非常巧妙,如果他们正在寻找库来为他们做这件事,每个人都应该知道如何以 servlet 形式做。

@Path("/helloworld")
public class HelloWorldResource {

    // The Java method will process HTTP GET requests
    @GET
    // The Java method will produce content identified by the MIME Media
    // type "text/plain"
    @Produces("text/plain")
    public String helloWorld() {
        // Return some cliched textual content
        return "Hello World";
    }
}

如果您要做的只是一个“服务”,它返回由 URL 参数驱动的文本,因此返回纯文本,是否需要框架?

【问题讨论】:

  • 其实 Jersey 是 JAX-RS 的参考实现。所以我称它为先驱者,而不是 Restlet。
  • 您的编辑使您的问题得到解答。如果您只想说“Hello World”,则不需要 JAX-RS。但谁只是想这样做呢?
  • 我应该在那里参考维基百科,我个人对称其为先驱者持谨慎态度
  • 如果这就是你正在做的“全部”,为什么还要为 servlet 烦恼呢?毕竟,只用 GET 你不应该改变任何地方的任何状态(好吧,不是名副其实的状态;服务器日志不算在内)。
  • Donal 我不关注... 那么什么处理 GET 请求?

标签: java rest jersey


【解决方案1】:

将 url 模式 /images 映射到 servlet 并使用一两行来解析 url 的参数而不是学习,实现不是更容易(对于未来的开发人员)和更快(实现和学习)并配置其中一个库来为您完成。

容易吗?写起来肯定不容易——你必须自己完成所有路径提取、所有方法处理和所有内容类型协商(在两个方向上)以及所有 cookie 处理和对象反序列化/serialization thunks 和……嗯,很多低级的东西都需要测试和调试——或者更容易维护,因为 JAX-RS 接口允许你在资源级别操作(RESTful webapps 的自然特征)请求数;有了丰富的经验,当概念模型和实现之间的差距最小时,维护是最容易的。它的实现也不是更快(因为 JAX-RS 的低级实现已经为您测试和调试过;您可以做的更少)并且学习它的成本不是很高,因为它主要是一个声明性 API很少有惊喜。

好的,当您只处理简单的 web 应用程序时,这些好处可能看起来并不多。毕竟,您可以在很短的时间内破解某些内容并将生成的应急方案放到网上。然后你必须祈祷你做对了,没有重大的意外途径来利用或拒绝服务攻击。在添加小功能或修复错误时,维护程序员必须了解您在代码中喷洒的那些正则表达式的作用(祝您好运!)。但随着 webapp 变得越来越大,拥有一个经过测试的库来处理所有低级内容的好处确实会胜出。

(在你问之前,你提到的一些库会很高兴地将它们自己安装为 servlet;这允许你的代码只描述 servlet 的业务逻辑并声明如何以抽象术语完成到线路的映射。这简直是巨大的更容易。)

【讨论】:

  • 什么时候使用常规 servlet 代替 jersey 是合适的?应该永远不要在 httpservlet 中处理 doPost 吗?
  • @jontro 当你喜欢手工做所有事情的时候?除非您迫切需要减少图书馆的数量,否则我不相信真的有充分的理由。
【解决方案2】:

JAX-RS 是一个设计精良的 API,它使得将 HTTP 请求映射到方法、从 HTTP 请求的各个部分提取参数、处理内容协商以及许多其他低级任务变得非常容易。

使用 JAX-RS,主要通过 Apache CXF,大约两年来,我总是更喜欢它而不是普通的 Servlet。

【讨论】:

  • 但是对于每个开发人员来说,学习、实施和理解的时间是值得的。我的意思是这样可以节省时间吗?真的更简单吗?如果只是提取参数,那么更接近 Java 标准肯定更容易。在 servlet 中提取参数会相当简单。我觉得它提供的价值可能会增加太多的复杂性。
  • 您不只是想提取参数。您想要设置 HTTP 响应代码、将传入和传出的主体映射到对象以及其他内容。是的,JAX-RS 对此有所帮助。
  • @avanderw 也许你的经验只是简单的 webapps,因为我从我那里知道它确实对更复杂的应用程序有很大帮助。直接在 servlet 级别执行所有这些工作将需要大量工作,但 JAXRS 让您可以更多地关注应用程序中的资源。 (并不是说它是完美的——一些令人惊讶的事情仍然很尴尬——但它确实让事情变得容易多了。)
【解决方案3】:

框架用于让您更轻松地完成任务。我同意我们可以通过实现 servlet 来做同样的事情,然后解析 url,然后实现基本逻辑。

如果您使用的是 jersey 之类的框架,那么您不必担心那些解析模式和其他类似任务。 ServletContainer 类会处理这个问题(在它的服务方法中解析 url),还有很多其他的类也会让你的任务更容易。

还有一件事,我们只采用一种场景(匹配模式),但是当我们的需求增长时,我们自己的 servlet 编写的相同代码将变得更加复杂和复杂。

【讨论】:

  • 这只是我的观点,为什么要用大锤敲钉子。如果框架很容易采用,那么当需要时,您应该能够比从另一个框架更容易地从 vanilla 转到该框架。当您只需要水龙头时,为什么还要使用整个厨房水槽?
  • 其实 JAX-RS 是一个 API,而 CXF、Jersey、RESTEasy 是实现。它们都有自己的强项和弱点,例如它们与 Spring 集成的难易程度。但我肯定会推荐使用 JAX-RS。
【解决方案4】:

在这种情况下,我会使用 Jersey 或库,如果它执行以下操作(增加足够的价值):

  • URL 的配置都包含在一个文件中,并带有源代码
  • 没有隐藏的配置文件或过于冗长的配置(例如 web.xml)
  • 参数很好地映射到强类型变量(例如使用注释)
  • 获取参数值并不复杂(例如RESTlet
  • 运行库的开销很低(我在其他库中使用反射解决方案时遇到过不好的经历)
  • 有据可查
  • 它被很好地采用了

在这种情况下,我发现使用库可以为我的项目增加使用它所需的努力的价值。 Jersey 似乎确实满足了这些要求,尽管我还没有对其他框架进行足够的调查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2021-08-07
    • 2023-02-09
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多