2011-02-04 32 views
13

Tôi đang tìm một giải pháp thay thế cho các khả năng REST tuyệt vời của .NET (WCF).Công nghệ web serviceervice REST nguồn mở tốt nào có ở đó?

Tại sao?

Tôi rất quan tâm đến công nghệ nguồn mở, nhưng khi nói đến dịch vụ web, tôi không có bất kỳ trải nghiệm nào ngoại trừ .NET webservices.

Bên cạnh đó, tôi hiện đang sử dụng rất nhiều Java và Python, và tôi đang di chuyển ra khỏi ngăn xếp công nghệ của Microsoft.

Vui lòng đề xuất các lựa chọn thay thế bằng bất kỳ ngôn ngữ lập trình nào, nhưng giải thích lý do tại sao tốt hoặc tốt hơn vì một số lý do. (lý do này có thể liên quan chặt chẽ với lựa chọn ngôn ngữ)

Tôi muốn biết điều gì?

  • Dễ sử dụng
    • Lắp đặt
    • Cấu hình
    • khả năng thế hệ
    • IDE tích hợp
    • Deployment
  • đường cong học tập
  • Ưu điểm và nhược điểm
  • , vv

Trả lời

7

mùa xuân 3,0 REST của:

Spring sử dụng chú thích dựa bộ điều khiển, có thể được sử dụng để ràng buộc một url tới một phương pháp trong điều khiển. Chú thích được sử dụng để phân biệt giữa phương thức GET và phương thức 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"; 
} 

Dưới mui xe, biến "khách sạn" trong chuỗi URI được chuyển đổi thành danh sách tham số, cũng như đặt trước. Spring REST cũng có thể sắp xếp các đối tượng JSON vào các lớp tùy chỉnh bằng cách sử dụng kỹ thuật tương tự này. Lưu ý rằng phương thức này được chú thích là RequestMethod.GET, có nghĩa là nó được gọi cho các yêu cầu GET nhưng không được yêu cầu POST.

Spring 3.0 REST giúp dễ dàng tạo các dịch vụ Web RESTful bằng cách loại bỏ sự cần thiết phải phát minh lại bánh xe hoặc văn bản JSON nguyên soái/không thay đổi bằng tay từ các đối tượng Java.

Có bản trình diễn tại đây trên Blog SpringSource có tiêu đề REST In Spring MVC. Đường cong học tập thấp, nhưng việc làm demo có thể mất một chút thời gian nhờ vào sự phụ thuộc. Sau khi bạn thiết lập và có bản trình diễn làm việc, phần khó nhất sẽ kết thúc.

Để tích hợp IDE, hãy xem Spring Roo. Tôi đã không sử dụng nó, nhưng tôi đã nghe nó có một số tính năng tích hợp với Eclipse IDE để làm cho cuộc sống của bạn dễ dàng hơn.

Restlets:

Restlets được thiết kế dành riêng cho REST. Kết quả là, chi phí thấp hơn rất nhiều so với Spring 3.0. Restlets phù hợp hơn cho các trường hợp bạn không có GUI và nơi bạn không quan tâm đến MVC. Restlets có thể dễ dàng phục vụ như một máy chủ và máy khách. Nó cũng có một máy chủ nhúng mà bạn có thể chạy, giúp loại bỏ sự cần thiết của một container như Jetty hoặc Tomcat.

Tôi đã tiếp xúc rất ít với Python, nhưng từ những gì tôi đã thấy về việc triển khai khung công tác webApp của Google App Engine, khái niệm Router cảm thấy rất giống nhau. Những người có nền Python có thể tìm thấy đường cong học tập thấp hơn rất nhiều:

@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; 
} 

Nó sử dụng GWT ở phía máy khách; Tôi thích lấy phần đó ra vì nó nhắc tôi quá nhiều về Java Swing. Trong khi một số người có thể thấy rằng lợi thế, sở thích cá nhân của tôi là gắn bó với các công nghệ cảm thấy giống Web hơn.

Dưới đây là ví dụ đơn giản về máy chủ REST sử dụng chế độ độc lập. Máy chủ chạy trên cổng 8182 và nó lắng nghe các yêu cầu GET. Nó có một mô hình dựa trên chú thích tương tự như khung công tác Spring REST, cũng giúp chia nhỏ các phương thức HTTP khác nhau và chỉ ra chúng theo các phương thức khác nhau trong các lớp của bạn. Đây là một "Hello World" REST của rất cơ bản Ví dụ:

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"; 
    } 

} 

Kiểm tra các Restlet Web Site để biết thêm thông tin và ví dụ về khuôn khổ Restlets. Restlets có đường cong học tập hơi ít so với Spring vì nó được nhắm đến REST; kết quả là, nó không chứa tất cả các chức năng bổ sung đi kèm với Spring mà đôi khi có thể làm cho việc tìm kiếm câu trả lời cho một vấn đề khó khăn. Restlets chắc chắn là con đường để đi nếu bạn đang tìm kiếm thứ gì đó nhẹ.

Cả hai khung này sẽ chạy trong Tomcat, Jetty, cũng như trên Google App Engine.

5

ServiceStack là một trong những phát triển gần đây hơn. Tôi chưa làm gì nhiều với nó, nhưng nó có vẻ khá ngọt ngào cho đến nay.

6

Nếu bạn đang sử dụng Java và bạn đã quen thuộc với Spring, thì bạn nên xem Spring MVC 3.x. Phiên bản này di chuyển ra khỏi cấu hình XML xấu xí và cú pháp của nó rất giống với thông số kỹ thuật của JAX-RS. Điều đó nói rằng, nếu bạn biết mùa xuân, sau đó học Spring MVC 3.0 sẽ là tối thiểu. Tuy nhiên, nếu bạn đang gặp khó khăn trong việc hiểu với mô hình IoC và những gì không, thì nó sẽ là một trải nghiệm đau đớn lâu dài. :)

Hãy nhớ, Spring MVC 3.x không phải là REST thuần túy và sẽ không bao giờ có trong tương lai, dựa trên các nhà phát triển Spring MVC. Họ đã có rất nhiều triển khai REST tốt và không có điểm làm cho Spring MVC 3.x hoàn toàn RESTful.

Một tùy chọn khác mà tôi chắc chắn sẽ giới thiệu cho bạn là Jersey. Jersey là REST thuần túy, nói cách khác, nó là một thực hiện của JAX-RS. Jersey đã cho tôi 30 phút để học. Theo tôi, các chú thích mạnh hơn và phong phú hơn Spring MVC 3.x. Các chú thích từ Spring MVC 3.x có vẻ khá vani với tôi. Jersey sẽ tự động tạo WADL cho bạn, mặc dù nó khá cơ bản ... nhưng có một cái tốt hơn là không có. Bạn chắc chắn có thể tùy chỉnh WADL của bạn nếu bạn muốn. (Nhân tiện, WADL là phiên bản WSDL của REST, nếu bạn không biết điều đó có nghĩa là gì). Jersey về cơ bản phát hiện gói của bạn có chứa tất cả các lớp học Resource và tạo WADL dựa trên cấu hình bạn có, nội dung khá gọn gàng. Điều cuối cùng tôi muốn chỉ ra là Jersey có một khuôn khổ kiểm tra tuyệt vời để bạn có thể dễ dàng kiểm tra dịch vụ web Restful của mình. Nói cách khác, khuôn khổ kiểm tra của họ cho phép kiểm tra đơn vị của bạn dễ dàng kích hoạt máy chủ Grizzly hoặc trong bộ nhớ để kiểm tra dịch vụ web của bạn.Nó chắc chắn là một trong những tốt nhất mà tôi đã từng sử dụng cho đến nay. Đây là một hướng dẫn rất dễ dàng để bạn bị ướt chân: http://www.vogella.de/articles/REST/article.html. Nó thực sự là THAT dễ dàng. :)

FYI, tôi đã sử dụng cả Spring MVC 3.x và Jersey.

+0

áo trông rất thú vị, sẽ xem xét! cảm ơn ;-) –

+0

Chú thích của Jersey thực sự phong phú, ít nhất so với Spring MVC 3.x.Bạn có thể áp dụng câu lệnh '@ PathParam' cho thuộc tính trong lớp' Resource' của bạn (về cơ bản tương ứng với lớp 'Controller' của Spring MVC) thay vì truyền nó qua tham số phương thức .. rất hữu ích đặc biệt nếu tất cả các API trong lớp' Resource' yêu cầu biến đường dẫn cụ thể đó. Trong Spring MVC 3.x, bạn phải đặt '@ PathVariable' là mọi phương thức trong lớp' Controller' để đạt được hiệu ứng tương tự ... hoặc ít nhất, tôi không biết làm thế nào để làm nó một cách tao nhã trong Spring MVC 3 .x. – limc

5

Ruby và Rails (Ruby on Rails) có hỗ trợ tuyệt vời cho dịch vụ RESTful. Trong thực tế Rails hỗ trợ và khuyến khích thiết kế và phát triển theo cách RESTful.

Nhờ tính năng DSL mạnh mẽ của Ruby, việc viết dịch vụ REST rất đơn giản và dễ dàng. Vì bạn có kinh nghiệm python, việc học ruby ​​có thể dễ dàng.

Hãy tham khảo guide để có ấn tượng về cách url còn lại (được gọi là tuyến đường trong đường ray) được xác định.

Các khung công tác web Ruby khác như Sinatra cũng thực hiện tốt công việc này.

BTW, những điều tốt nhất là cả ruby ​​và đường ray đều là nguồn mở và cộng đồng ruby ​​thật tuyệt vời và rất tích cực.

1

Có một khuôn khổ mã nguồn mở hoàn toàn được phát triển cho các dịch vụ web RESTful được gọi là Recess

Đó là không phải là rất cũ, nhưng có ý tốt từ ngành công nghiệp. Alcatel-Lucene đã được sắp xếp a competition on TopCoder để phát triển một số dịch vụ của họ bằng cách sử dụng khung này.

Kiểm tra chi tiết tại Recess web site

3

tôi chào đón bạn đến kiểm tra servicestack.net nó được thiết kế để đơn giản và tốc độ và giới thiệu khái niệm nhân tạo rất thấp, nơi nó có thể duy trì một API rất khô và ngắn gọn và tự động hoạt động ra khỏi hộp mà không có bất kỳ cấu hình hoặc mã-gen.

Nó khuyến khích thực hành tốt nhất vì nó được mô hình hóa xung quanh Martin Fowlers Gateway và mô hình DTO để phát triển các dịch vụ từ xa.

Đọan mã tương ứng ví dụ Spring.NET trên sẽ là

Cấu hình (trong AppHost)

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

C# Mã

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; 
    } 
} 

Một ví dụ tương tự như dịch vụ đặt chỗ có thể được xem trực tiếp Northwind Web Services demo.

Đó là tất cả cấu hình và mã (exc DTO) bạn cần phải viết cho dịch vụ đó và nó tự động có sẵn qua JSON, XML, JSV, CSV, SOAP 1.1/1.2 và các điểm cuối và định dạng HTML một cách tự động mà không cần bất kỳ cấu hình bổ sung nào .

Thanh toán Hello World example để biết thêm thông tin về tất cả các điểm cuối và định dạng được cung cấp cũng như trang được tạo tự động/siêu dữ liệu và tài liệu.

Các vấn đề liên quan