关于Web服务:目前有什么好的开源REST Web服务技术?

What good open source REST webservice technology is out there?

我正在寻找超棒的.NET(WCF)REST功能的替代品。

为什么?

我对开放源代码技术深感兴趣,但是当涉及到Web服务时,除了.NET Web服务之外,我没有任何经验。

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

请在任何编程语言中建议替代方案,但出于某些原因,请解释其优劣之处。 (此原因可能与语言选择紧密相关)

我想知道什么?

  • 使用方便

    • 安装
    • 配置
    • 发电能力
    • IDE整合
    • 部署方式
  • 学习曲线
  • 利弊
  • 等等。

Spring 3.0 REST:

Spring使用基于注释的控制器,该控制器可用于将url绑定到控制器中的方法。注释用于区分GET方法和POST方法。

1
2
3
4
5
6
7
8
9
10
@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对象到Java对象的手动或编组/解组JSON文本的需求,使创建RESTful Web服务变得更加容易。

SpringSource博客上有一个名为REST in Spring MVC的演示。学习曲线很低,但是由于依赖关系,使演示开始工作可能需要一些时间。一旦设置好并有可用的演示,最困难的部分应该结束了。

要进行IDE集成,请查看Spring Roo。我没有使用过它,但是我听说它具有与Eclipse IDE集成的一些功能,可以使您的生活更轻松。

座便器:

Restlets专为REST设计。结果,开销比Spring 3.0低很多。 Restlets更适合没有GUI且与MVC无关的情况。 Restlets可以轻松地充当服务器和客户端。它还具有可以运行的嵌入式服务器,从而无需使用诸如Jetty或Tomcat之类的容器。

我几乎没有接触过Python,但是从Google App Engine对webApp框架的实现中可以看到,Router的概念非常相似。具有Python背景的人可能会发现学习曲线要??低得多:

1
2
3
4
5
6
7
8
9
10
11
12
@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示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
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网站,以获取有关Restlets框架的更多信息和示例。 Restlets的学习曲线比Spring少一些,因为它的目标是REST。结果,它没有包含Spring附带的所有额外功能,这些功能有时会使查找问题的答案变得困难。如果您正在寻找轻巧的东西,那么坐便器绝对是您的最佳选择。

这两个框架都将在Tomcat,Jetty和Google App Engine中运行。


如果您使用Java并且对Spring熟悉,那么您当然应该看一下Spring MVC3.x。该版本摆脱了难看的XML配置,其语法与JAX-RS的规范非常相似。就是说,如果您了解Spring,那么对Spring MVC 3.0的学习将变得非常简单。但是,如果您对IoC模式有什么了解,或者对其他什么都不了解,那么这将是一个长期的痛苦经历。 :)

请记住,基于Spring MVC开发人员,Spring MVC 3.x并不是纯粹的REST,将来也永远不会。他们的看法是,已经有许多好的REST实现,并且没有必要使Spring MVC 3.x完全具有RESTful。

我当然会向您推荐的另一个选择是泽西岛。 Jersey是纯REST,也就是说,它是JAX-RS的实现。泽西花了我30分钟时间来学习。在我看来,这些注释比Spring MVC 3.x强大得多。 Spring MVC 3.x的注释对我来说似乎非常有用。 Jersey Jersey会自动为您生成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。


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

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

请参阅本指南,以了解如何定义其余URL(在rails中称为route)。

Sinatra等其他Ruby Web框架在此方面也做得很好。

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


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


我欢迎您访问servicestack.net,它旨在简化操作并提高速度,并引入了非常低的人工概念,它能够保持非常干燥且简洁的API,并且无需任何配置或代码即可自动开箱即用- gen。

它鼓励采用最佳实践,因为它以Martin Fowlers Gateway和DTO模式为蓝本,用于开发远程服务。

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

配置(在AppHost中)

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

C#代码

1
2
3
4
5
6
7
8
9
10
11
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服务演示可以看到与预订服务类似的示例。

这就是您需要为该服务编写的所有配置和代码(exc DTO),并且可以自动通过JSON,XML,JSV,CSV,SOAP 1.1 / 1.2和HTML端点和格式自动使用,而无需进行任何其他配置。

查看Hello World示例,以获取有关提供的所有端点和格式以及自动生成的/ metadata和文档页面的更多信息。


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


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

它不是很老,但是得到了业界的广泛关注。阿尔卡特朗讯(Alcatel-Lucene)已经在TopCoder上安排了一场竞赛,以使用该框架开发其某些服务。

在Recess网站上查看详细信息