【问题标题】:What good open source REST webservice technology is out there?有什么好的开源 REST Web 服务技术?
【发布时间】:2011-02-04 16:10:23
【问题描述】:

我正在寻找出色的 .NET (WCF) REST 功能的替代方案。

为什么?

我对开源技术有着浓厚的兴趣,但谈到 web 服务,我除了 .NET web 服务外没有任何经验。

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

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

我想知道什么?

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

【问题讨论】:

    标签: web-services


    【解决方案1】:

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

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

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

    Restlets

    Restlet 专为 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 附带的所有额外功能,这些功能有时会使寻找问题的答案变得困难。如果您正在寻找轻量级的东西,Restlet 绝对是您的不二之选。

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

    【讨论】:

      【解决方案2】:

      如果您使用 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 的注释对我来说似乎很普通。 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。

      【讨论】:

      • 球衣看起来很有趣,会研究一下!谢谢;-)
      • Jersey 的注解真的很丰富,至少相比 Spring MVC 3.x。您可以将 @PathParam 应用于 Resource 类中的属性(基本上是 Spring MVC 的 Controller 类),而不是通过方法参数传递它。非常有用,特别是如果 Resource 类中的所有 API 都需要那个特定的路径变量。在 Spring MVC 3.x 中,您必须将 @PathVariable 设置为 Controller 类中的每个方法才能达到相同的效果......或者至少,我不知道如何在 Spring MVC 3 中优雅地做到这一点。 x.
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        得益于 ruby​​ 强大的 DSL 特性,编写 REST 服务非常简单明了。由于您有 python 经验,学习 ruby​​ 可能很容易。

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

        其他 Ruby Web 框架(例如 Sinatra)在这方面也做得很好。

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            欢迎您查看servicestack.net,它旨在简化和速度,并引入了非常低的人工概念,它能够维护非常干燥和简洁的 API,并且无需任何配置或代码即可自动开箱即用 -将军

            它鼓励最佳实践,因为它以 Martin Fowlers 网关和 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可以看到类似预订服务的例子。

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

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

            【讨论】:

              【解决方案7】:

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

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

              Recess web site查看详细信息

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-09-20
                • 1970-01-01
                • 1970-01-01
                • 2010-11-18
                • 2014-01-23
                • 1970-01-01
                • 1970-01-01
                • 2013-04-30
                相关资源
                最近更新 更多