【问题标题】:RESTful Webservices on Google App EngineGoogle App Engine 上的 RESTful Web 服务
【发布时间】:2012-02-19 11:05:48
【问题描述】:

首先我要说的是,我在 Google App Engine 方面的经验并不丰富。

我知道我们有可能在 GAE 上部署 RESTful Web 服务 (JERSEY)

我也知道 RESTLET 有一个专门用于 GAE 的版本。

我想听取那些使用过这两种方法的人的建议,哪种方法更好。

例如,为 JERSEY 配置 GAE 应用程序是否太困难或难以解决? 或者例如使用 RESTLET 有什么缺点吗?还是太厚了(RESTLET)?

谢谢

【问题讨论】:

    标签: web-services google-app-engine jersey restlet


    【解决方案1】:

    我已经尝试过 Restlet,但对它并不满意:它试图做很多事情,但它的核心不是 JAX-RS(他们将它作为附加组件)。我有问题让它在各种设置下工作(请求不会被路由到方法,但是当只更改方法顺序时它会开始工作。WTF?!)。此外,他们的文档稀缺且不一致。

    我查看了 Jersey:当时在 GAE 上运行存在一些问题(通过支持论坛上的帮助解决)。我还发现他们的文档不是那么好。

    最后,我选择了 Resteasy/Jackson:文档非常棒,可以与 Maven 一起使用,可以完全控制配置、安全性和错误处理(代码中抛出的异常作为 JSON 错误对象返回)。基本没有问题。您可以在此处查看示例:LeanEngine REST classes

    此外,如果与 JSON/Jackson 一起使用(确保强制使用 Jackson 1.9,因为 1.7 中的内置版本已过时),您可以对如何将类映射到 JSON 进行大量控制:一对一、包装/嵌入、适配器模式等。

    【讨论】:

    • 你能帮忙吗?我试图让 RESTEasy 在 GAE 上工作,但没有任何成功。绝对没有我能找到的文档(zip 附带 >20 个 jars,GAE JSON+XML 服务器实际上需要哪些 jars?)
    【解决方案2】:

    我已经在 GAE 上使用 Restlet 大约 6 个月了。我选择它的部分原因是他们也有 Android 和 GWT 版本,这也是我的产品组合的一部分,我认为在任何地方都使用相同的东西是最简单的。

    与 Peter K 的评论相比,我发现文档非常好。除了 restlet.org 上的在线文档之外,Manning 还提供了一本 400 页的电子书 (Restlet in Action),内容非常深入。这本电子书可能是在彼得评估之后出版的。

    话虽如此,它是一个相当大的库,具有很多功能,这是一把双刃剑。一方面,每次我想解决一种新的问题时,似乎 Restlet 已经内置了一些东西来使它更容易。另一方面,当我试图找出问题时,我发现通过 Restlet 源代码进行调试是一项挑战——所有这些灵活性和功能加起来形成了一个广泛而深入的类层次结构,有时很难看到这些部分是如何组合在一起的。如果您正在构建一个实质性的应用程序,我认为值得一看,因为我认为您不会在使用 Restlet 时遇到很多限制。但是,我没有使用过 RestEasy,因此无法对其进行明智的比较。

    【讨论】:

      【解决方案3】:

      我在一年前开始使用 Jersey 和 Google App Engine 开发一个应用程序。我的经验很棒,但我从未使用过 Restlet ..

      我在这里尝试总结一下我在 GAE 集成中发现的主要困难:

      • 球衣版本:1.6 作品
      • 我建议您使用 Jackson(1.7.1 版)进行 json 表示

      web.xml 片段:

      <servlet>
      <servlet-name>jersey</servlet-name>
      <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
      <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>***package-with-your-classes***;org.codehaus.jackson.jaxrs</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
      </servlet>
      

      配置器:

      @Provider
      public class JAXBContextResolver implements ContextResolver<JAXBContext> {
      private AnnoxAnnotationReader annotationReader;
      private JAXBContext context;
      private Class<?>[] classTypes = new Class[] { .. all your classes .. };
      
      public JAXBContextResolver() {
      annotationReader = new AnnoxAnnotationReader();
      Map<String, Object> properties = new HashMap<String, Object>();
      properties.put(JAXBRIContext.ANNOTATION_READER, annotationReader);      
      try {
          this.context = JAXBContext.newInstance(classTypes, properties);
      } catch (JAXBException e) {
          ..  
      }
      public JAXBContext getContext(Class<?> objectType) {
          return context;
      }
      

      .. 如您所见,我使用 Annox 来避免在我的模型类中添加注释!

      希望对您有所帮助! 米歇尔·奥尔西

      【讨论】:

      • 您是说您在使用 1.6 以外的其他版本时遇到了问题?尽管您的第一段是从介绍开始的,但您并没有多说您遇到的困难。
      • 你是对的,问题是我没有太多时间去调查为什么它不起作用,现在我可以接受了!
      猜你喜欢
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      相关资源
      最近更新 更多