2011-02-04 43 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以獲取有關所提供的所有端點和格式以及自動生成/元數據和文檔頁面的更多信息。