Google App Engine上的RESTful Web服务

时间:2012-02-19 11:05:48

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

首先,我需要说我在Google App Engine中没那么有经验。

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

而且我也知道 RESTLET 有一个专门针对GAE的版本。

我想从那些使用两种方法的人那里获得建议。

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

由于

3 个答案:

答案 0 :(得分:6)

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

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

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

此外,如果与JSON / Jackson一起使用(确保强制使用Jackson 1.9,因为1.7内置旧版本),您可以很好地控制类如何映射到JSON:一对一,包装/嵌入,适配器模式等。

答案 1 :(得分:3)

我一直在GAE上使用Restlet大约6个月。我之所以选择它,部分原因是因为它们也有适用于Android和GWT的版本,这也是我产品组合的一部分,而且我认为最简单的方法是在任何地方使用相同的东西。

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

话虽这么说,它是一个非常大的图书馆,有很多功能,这是一把双刃剑。一方面,每当我想解决一个新的问题时,似乎Restlet已经内置了一些内容以使其更容易。另一方面,当我试图找出问题时,我发现通过Restlet源进行调试很有挑战性 - 所有这些灵活性和功能都会增加一个广泛而深入的类层次结构,有时很难看到这些碎片如何组合在一起。如果你正在构建一个实质性的应用程序,我认为值得一看,因为我不认为你会遇到Restlet的许多限制。但是,我没有使用过RestEasy,所以我无法对它做出明智的比较。

答案 2 :(得分:2)

我在一年前开始使用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来避免模型类中的注释!

希望它有所帮助! Michele Orsi