有什么好的开源REST Web服务技术?

时间:2011-02-04 16:10:24

标签: web-services

我正在寻找令人敬畏的.NET(WCF)REST功能的替代方案。

为什么?

我对开源技术很感兴趣,但是当涉及到webservices时,除了使用.NET webservices之外,我没有任何经验。

此外,我目前正在使用大量的Java和Python,而我正在远离Microsoft技术堆栈。

请用任何编程语言建议替代方案,但解释为什么它出于某些原因是好的或更好的。 (这个原因可能与语言的选择密切相关)

我想知道什么?

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

7 个答案:

答案 0 :(得分:7)

Spring 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使得创建RESTful Web服务变得更加容易,因为无需重新发明轮子或从/向Java对象手动编组/解组JSON文本。

SpringSource博客上有一个名为REST In Spring MVC的演示。学习曲线很低,但由于依赖性,让演示工作可能需要一些时间。一旦你进行了设置并进行了工作演示,最困难的部分就应该结束了。

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

<强> Restlets

Restlets专为REST设计。因此,开销比Spring 3.0低很多。 Restlet更适合于没有GUI的情况,以及不关心MVC的情况。 Restlet可以轻松地充当服务器和客户端。它还有一个可以运行的嵌入式服务器,无需像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上运行。

答案 1 :(得分: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版本,如果您不知道这意味着什么)。 Jersey基本上检测到包含所有Resource类的包,并根据您拥有的配置生成WADL,非常简洁。我要指出的最后一件事是,Jersey有一个很好的测试框架,可以让您轻松测试Restful Web服务。换句话说,他们的测试框架允许您的单元测试轻松启动Grizzly或内存服务器来测试您的Web服务。这肯定是迄今为止我用过的最好的之一。这是一个非常简单的教程,让你的脚湿透了:http://www.vogella.de/articles/REST/article.html。这真的很容易那么。 :)

仅供参考,我使用过Spring MVC 3.x和Jersey。

答案 2 :(得分:5)

ServiceStack是最近的发展之一。我还没有做太多的事情,但到目前为止看起来很可爱。

答案 3 :(得分:5)

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

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

请参阅此guide,了解如何定义rest url(称为rails中的路由)。

其他Ruby Web框架(如Sinatra)也做得很好。

顺便说一句,最好的事情是ruby和rails都是开源的,ruby社区非常棒且非常活跃。

答案 4 :(得分:3)

RESTSharp作为REST / HTTP客户端(开源项目)和OpenRasta

答案 5 :(得分: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以获取有关所提供的所有端点和格式以及自动生成/元数据和文档页面的更多信息。

答案 6 :(得分:1)

有一个完全为RESTful Web服务开发的开源框架,称为Recess

它不是很老,但得到了业界的好评。 Alcatel-Lucene已经安排a competition on TopCoder使用这个框架开发他们的一些服务。

查看Recess web site

的详细信息