2011-02-04 12 views
13

Estoy buscando una alternativa a las impresionantes capacidades de REST .NET (WCF).¿Qué buena tecnología de servicio web REST de código abierto existe?

¿Por qué?

Tengo un gran interés en la tecnología de código abierto, pero cuando se trata de servicios web, no tengo ninguna experiencia, excepto con los servicios web .NET.

Además, actualmente estoy usando mucho Java y Python, y me estoy alejando de la pila de tecnología de Microsoft.

Por favor, sugiera alternativas en cualquier lenguaje de programación, pero explique por qué es bueno o mejor por alguna razón. (esta razón puede estar estrechamente relacionada con la elección del idioma)

¿Qué es lo que quiero saber?

  • Facilidad de uso
    • instalación
    • configuración
    • capacidades de generación de
    • integración IDE
    • despliegue
  • curva de aprendizaje
  • Pros y contras
  • etc.

Respuesta

7

Spring 3.0 REST:

primavera utiliza controladores basados ​​anotación, que se pueden usar para unirse a un URL a un método en el controlador. Las anotaciones se utilizan para diferenciar entre los métodos GET y los métodos 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"; 
} 

Bajo el capó, la variable "hotel" en la cadena de URI se convierte en un largo en la lista de parámetros, como es la reserva. Spring REST también puede ordenar objetos JSON en clases personalizadas utilizando esta misma técnica. Tenga en cuenta que este método está anotado como RequestMethod.GET, lo que significa que se invoca para las solicitudes GET pero no para las solicitudes POST.

Spring 3.0 REST hace que sea más fácil crear servicios web RESTful eliminando la necesidad de reinventar la rueda o mariscal/unmarshal texto JSON a mano desde/a objetos Java.

Hay una demostración aquí en el blog de SpringSource titulada REST In Spring MVC. La curva de aprendizaje es baja, pero hacer que la demostración funcione puede llevar cierto tiempo gracias a las dependencias. Una vez que tenga la configuración y tenga una demostración en funcionamiento, la parte más difícil debería haber terminado.

Para la integración de IDE, echa un vistazo a Spring Roo. No lo he usado, pero he oído que tiene algunas características que se integran con Eclipse IDE para hacerte la vida más fácil.

Restlets:

Restlets fueron diseñados exclusivamente para descansar. Como resultado, la sobrecarga es mucho menor que la del Spring 3.0. Los Restlets son más adecuados para casos en los que no tiene una GUI y en los que no le preocupa MVC. Restlets puede servir fácilmente como servidor y como cliente. También tiene un servidor integrado que puede ejecutar, lo que elimina la necesidad de un contenedor como Jetty o Tomcat.

He tenido muy poca exposición a Python, pero por lo que he visto de la implementación de Google App Engine del framework webApp, el concepto de enrutador se siente muy similar. Aquellos con un fondo de Python puede encontrar la curva de aprendizaje para ser mucho más bajo:

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

Utiliza GWT en el lado del cliente; Prefiero sacar esa parte ya que me recuerda demasiado a Java Swing. Si bien algunas personas pueden encontrar eso ventajoso, mi preferencia personal es seguir con las tecnologías que se parecen más a la Web.

A continuación se muestra un ejemplo simple de un servidor REST que utiliza el modo independiente. El servidor se ejecuta en el puerto 8182 y escucha las solicitudes GET. Tiene un modelo similar basado en anotaciones como el marco Spring REST, que también ayuda a dividir los diferentes métodos HTTP y los señala en diferentes métodos en sus clases. Este es un ejemplo muy básico "Hello World" RESTO:

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

} 

Mira la Restlet Web Site para obtener más información y ejemplos del marco Restlets. Restlets tiene una curva de aprendizaje ligeramente menor que Spring porque está dirigida a REST; como resultado, no contiene toda la funcionalidad extra incluida con Spring que a veces puede dificultar la búsqueda de una respuesta a un problema. Los Restlets son definitivamente el camino a seguir si estás buscando algo ligero.

Ambos dos marcos se ejecutarán en Tomcat, Jetty, así como en Google App Engine.

5

ServiceStack es uno de los desarrollos más recientes. Todavía no he hecho mucho con eso, pero parece bastante dulce hasta ahora.

6

Si está utilizando Java y está familiarizado con Spring, entonces seguramente debería echar un vistazo a Spring MVC 3.x. Esta versión se aleja de la fea configuración XML y su sintaxis es muy similar a las especificaciones de JAX-RS. Dicho esto, si conoce Spring, entonces aprender Spring MVC 3.0 será mínimo. Sin embargo, si tiene problemas para entender el patrón de IoC y lo que no, será una experiencia larga y dolorosa. :)

Tenga en cuenta que Spring MVC 3.x no es REST puro, y nunca lo será en el futuro, según los desarrolladores de Spring MVC. Su opinión fue que ya hay tantas implementaciones de REST buenas y no tiene sentido hacer Spring MVC 3.x totalmente RESTful.

Otra opción que seguramente recomendaré es Jersey. Jersey es puro REST, en otras palabras, es una implementación de JAX-RS. Jersey tardó 30 minutos en aprender. En mi opinión, las anotaciones son mucho más potentes y ricas que Spring MVC 3.x. Las anotaciones de Spring MVC 3.x me parecen bastante vanas. Jersey generará automáticamente el WADL para usted, aunque es bastante básico ... pero tener uno es mejor que no tener uno. Sin duda puede personalizar su WADL si lo desea. (Por cierto, WADL es la versión REST de WSDL, si no sabes lo que eso significa). Jersey básicamente detecta su paquete que contiene todas las clases Resource y genera el WADL en función de las configuraciones que tiene, cosas bastante ordenadas. Lo último que quiero señalar es que Jersey tiene un excelente marco de prueba para que pueda probar fácilmente su servicio web Restful. En otras palabras, su marco de prueba permite que la prueba de su unidad encienda fácilmente Grizzly o el servidor en memoria para probar su servicio web.Sin duda es uno de los mejores que he usado hasta ahora. Aquí hay un tutorial muy fácil para que te mojes los pies: http://www.vogella.de/articles/REST/article.html. Realmente es QUE fácil. :)

FYI, he usado tanto Spring MVC 3.xy Jersey.

+0

jersey se ve muy interesante, se verá en él! gracias ;-) –

+0

La anotación de Jersey es muy rica, al menos en comparación con Spring MVC 3.x.Puede aplicar decir '@ PathParam' a una propiedad en su clase' Resource' (básicamente Spring MVC equivalente a la clase 'Controller') en lugar de pasarlo a través del parámetro method ... muy útil especialmente si todas las API en la clase' Resource' requieren esa variable de ruta particular. En Spring MVC 3.x, debe establecer '@ PathVariable' en cada método de la clase' Controller' para lograr el mismo efecto ... o al menos, no sé cómo hacerlo elegantemente en Spring MVC 3 .X. – limc

5

Ruby y Rails (Ruby on Rails) son de gran ayuda para el servicio RESTful. De hecho, Rails apoya y fomenta el diseño y el desarrollo de manera RESTful.

Gracias a la potente función DSL de ruby, escribir el servicio REST es muy sencillo y fácil. Como tienes experiencia en python, aprender ruby ​​puede ser fácil.

Consulte esta guide para tener una idea de cómo se definen las URL de reposo (llamadas rutas en los raíles).

Otros frameworks web de Ruby como Sinatra también hacen un buen trabajo en esto.

Por cierto, lo mejor es que tanto el ruby ​​como los rieles son de código abierto, y la comunidad de ruby ​​es increíble y muy activa.

1

Hay un marco de código abierto desarrollado por completo por los servicios web RESTful que se llama Recess

No es muy antiguo, pero tiene buena atención por parte de la industria. Alcatel-Lucene ya organizó a competition on TopCoder para desarrollar algunos de sus servicios utilizando este marco.

Echa un vistazo a los detalles en Recess web site

3

que le dan la bienvenida a echa un vistazo a servicestack.net que está diseñado para la simplicidad y la rapidez y presenta muy bajos conceptos artificiales en los que es capaz de mantener una API muy seco y conciso y automáticamente se resuelve de la caja sin ninguna configuración o código-gen.

Fomenta las mejores prácticas, ya que se basa en el patrón Martin Fowlers Gateway y DTO para el desarrollo de servicios remotos.

El código equivalente para el ejemplo anterior sería Spring.NET

configuración (en APPHOST)

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

C# Código

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

Un ejemplo similar a la El servicio de reservas puede ser visto por el directo Northwind Web Services demo.

Esa es toda la configuración y el código (DTO exc) que necesita para escribir para ese servicio y está automáticamente disponible a través de JSON, XML, JSV, CSV, SOAP 1.1/1.2 y HTML endpoints y formatos automáticamente sin necesidad de configuración adicional .

Consulte el Hello World example para obtener más información sobre todos los puntos finales y formatos proporcionados, así como las páginas autogeneradas/metadatos y documentación.

Cuestiones relacionadas