2011-02-04 76 views
13

我正在寻找真棒.NET(WCF)REST功能的替代方案。开源REST Web服务技术有哪些优点?

为什么?

我对开源技术有浓厚的兴趣,但是当涉及到web服务时,除了使用.NET webservices,我没有任何经验。

此外,我目前正在使用大量的Java和Python,而我正在从微软技术堆栈移开。

请在任何编程语言中建议其他选择,但请解释为什么由于某些原因它好或好。 (这可能与语言的选择密切相关)

我想知道什么?

  • 易于使用的
    • 安装
    • 配置
    • 生成功能
    • IDE集成
    • 部署
  • 学习曲线
  • 个利弊

回答

7

春季3.0 REST

Spring使用基于注解控制器,其可用于为一个URL绑定到控制器的方法。注解用于区分GET方法和POST方法。

@RequestMapping(value="/hotels/{hotel}/bookings/{booking}", 
     method=RequestMethod.GET) 
public String getBooking(@PathVariable("hotel") long hotelId, 
      @PathVariable("booking")  long bookingId, Model model) { 

    Hotel hotel = hotelService.getHotel(hotelId); 
    Booking booking = hotel.getBooking(bookingId); 
    model.addAttribute("booking", booking); 
    return "booking"; 
} 

在引擎盖下,URI字符串中的变量“hotel”在参数列表中被转换为long,就像预订一样。 Spring REST也可以使用这种相同的技术将JSON对象封送到自定义类中。请注意,此方法注释为RequestMethod.GET,这意味着它被调用GET请求而不是POST请求。

Spring 3.0 REST通过消除手动重新创建轮子或编组/解组Java/JSON文本的需要,可以更轻松地创建REST式Web服务。

SpringSource博客上有一个演示,标题为REST In Spring MVC。学习曲线很低,但得益于依赖关系,让演示工作可能需要一些时间。一旦你安装了并且有一个工作演示,最难的部分应该结束。

对于IDE集成,请查看Spring Roo。我没有使用它,但我听说它具有与Eclipse IDE集成的一些功能,使您的生活更轻松。

Restlets

Restlets设计完全休息。结果,开销比Spring 3.0要低很多。 Restlets更适合您没有GUI的情况,以及您不关心MVC的情况。 Restlets可以轻松地作为服务器和客户端。它还有一个你可以运行的嵌入式服务器,它不需要像Jetty或Tomcat这样的容器。

我已经很少接触到Python,但从我看到的Google App Engine的webApp框架实现中,Router概念感觉非常相似。那些有Python背景的人可能会发现学习曲线要​​低得多:

@Override 
public Restlet createInboundRoot() { 
    Router router = new Router(getContext()); 
    getConnectorService().getClientProtocols().add(Protocol.FILE); 

    // Serve the files generated by the GWT compilation step. 
    Directory dir = new Directory(getContext(), LocalReference.createFileReference(new File("war/"))); 
    router.attachDefault(dir); 
    router.attach("/contacts/123", ContactServerResource.class); 

    return router; 
} 

它在客户端使用GWT;我更喜欢把这部分拿出来,因为它让我想起了太多的Java Swing。虽然有些人可能会发现这种优势,但我的个人偏好是坚持那些更像Web的技术。

以下是使用独立模式的REST服务器的简单示例。服务器在端口8182上运行,并侦听GET请求。它具有与Spring REST框架类似的基于注释的模型,它还帮助分离不同的HTTP方法,并将它们指向类中的不同方法。这是一个非常基本的“Hello World” REST示例:

public class FirstServerResource extends ServerResource { 

    public static void main(String[] args) throws Exception { 
     // Create the HTTP server and listen on port 8182 
     new Server(Protocol.HTTP, 8182, FirstServerResource.class).start(); 
    } 

    @Get 
    public String toString() { 
     return "hello, world"; 
    } 

} 

退房的Restlet Web Site更多的信息和Restlets框架的例子。 Restlets的学习曲线略少于Spring,因为它的目标是REST;因此,它不包含Spring中包含的所有额外功能,有时可以使难题找到答案。如果您正在寻找轻量级的产品,Restlets绝对是您的选择。

这两个框架都将运行在Tomcat,Jetty以及Google App Engine上。

5

ServiceStack是较近期的发展之一。我还没有做太多的工作,但目前看起来相当不错。

6

如果您使用的是Java并且您熟悉Spring,那么您一定应该看看Spring MVC 3.x.这个版本远离丑陋的XML配置,其语法与JAX-RS的规格非常相似。也就是说,如果你了解Spring,那么学习Spring MVC 3.0将会很小。但是,如果您无法理解IoC模式以及不了解什么,那么这将是一个漫长的痛苦经历。 :)

请记住,Spring MVC 3.x 不是纯粹的REST,它绝不会在未来根据Spring MVC开发人员。他们的要求是已经有很多好的REST实现,并且没有必要让Spring MVC 3.x完全RESTful。

我肯定会向你推荐的另一种选择是Jersey。 Jersey是纯粹的REST,换句话说,它是JAX-RS的实现。泽西花了我30分钟的时间来学习。在我看来,注释比Spring MVC 3.x更强大更丰富。来自Spring MVC 3.x的注释对我来说似乎非常有用。泽西岛会为你自动生成WADL,虽然它很基本......但是有一个比没有一个更好。如果你愿意,你当然可以定制你的WADL。 (顺便说一句,WADL是REST的WSDL版本,如果你不知道这意味着什么)。泽西基本上检测你的包含所有Resource类的包,并根据你所拥有的配置生成WADL,非常整洁。我想指出的最后一件事是Jersey有一个很好的测试框架,可以让您轻松测试您的Restful Web服务。换句话说,他们的测试框架允许您的单元测试轻松启动Grizzly或内存服务器来测试您的Web服务。这绝对是迄今为止我所用过的最好的之一。这里有一个非常简单的教程,让你的脚湿润:http://www.vogella.de/articles/REST/article.html。这真的是那个容易。 :)

仅供参考,我已经使用Spring MVC 3.x和泽西岛。

+0

球衣看起来很有趣,会看着它!谢谢;-) – 2011-02-10 20:32:05

5

Ruby和Rails (Ruby on Rails)对RESTful服务有很大的支持。事实上,Rails支持并鼓励以RESTful方式进行设计和开发。

感谢ruby强大的DSL功能,编写REST服务非常简单易行。既然你有python的经验,学习ruby可能很容易。

请参阅此guide以了解如何定义其他网址(称为路径)。其他Ruby Web框架如Sinatra在这方面也做得很好。

顺便说一句,最好的事情是,红宝石和Rails都是开源的,而Ruby社区非常棒,非常活跃。

1

没有为RESTful Web服务开发研制的开源框架被称为Recess

这不是很老,却得到了不错的关注从行业。阿尔卡特Lucene已经安排了a competition on TopCoder使用这个框架开发他们的一些服务。

退房在Recess web site

3

详细信息欢迎您来我看看servicestack.net它是专为简化和速度,并引入了非常低的人工概念它能够保持一个非常干燥,简洁的API和自动工作出没有任何配置或代码的箱子。

它鼓励采用Martin Fowlers Gateway和DTO模式开发远程服务的最佳实践。

为Spring.NET示例的等效代码上面会

配置(在APPHOST)

Routes.Add<Booking>("/hotels/{HotelId}/bookings/{BookingId}"); 

C#代码

public class BookingService : RestServiceBase<Booking> 
{ 
    public IHotelService hotelService { get; set; } //auto-injected by IOC 

    public object OnGet(Booking request) 
    { 
     var hotel = hotelService.GetHotel(request.HotelId); 
     var booking = hotel.GetBooking(request.BookingId); 
     return booking; 
    } 
} 

一个类似的例子的预订服务可以通过现场看到Northwind Web Services demo

这就是您需要为该服务编写的所有配置和代码(exc DTO),并且无需任何额外配置即可自动通过JSON,XML,JSV,CSV,SOAP 1.1/1.2和HTML端点和格式自动获得。 。

检出Hello World example以获取有关所提供的所有端点和格式以及自动生成/元数据和文档页面的更多信息。