2010-12-08 18 views
9

Sé que esta pregunta es demasiado amplia para ser respondida con un simple "utilizar este marco", pero realmente agradecería su consejo sobre eso.¿Cómo elegir el marco RESTful perfecto?

Estoy buscando hacer un proyecto (bastante complejo) que ejecutará una API. Estoy abierto a cualquier lenguaje de programación (PHP, Python, Java principalmente) y encontré muchos frameworks que están más orientados a hacer un servidor web RESTful.

La única restricción importante que tengo es que tendré un paquete reutilizable, simple y sin código de espagueti independiente para mejorar mi API más tarde fácilmente o incluso cambiar a otro framework sin problemas.

Para Python & Java, pensé en hacer un paquete dedicado. Cada acción llamaría al método dedicado en el paquete, el paquete devolvería object/dict y la acción lo transformaría al formato adecuado.

Después de muchas investigaciones, que dudan entre dos marco que podría ser bueno para mi trabajo pero Necesito su consejo porque yo no cometer ningún error aquí.

  1. Play! Framework (Java)
    • Pros:
      • router están orientados reparador (define el método (GET, POST, etc), la solicitud y la class.method a utilizar)
      • Usted no tiene que hacer una clase por acción
    • Contras:
      • El modelo ya está incluido. Si más tarde cambio el marco, tal vez me quede atascado (pero aparentemente no desde Play! Parece usar JPA)
      • Tal vez el hecho de que si quiero enviar parámetros a la acción que se definiría en la firma del método , tengo que adoptar las ClassName.properties en lugar de un json como {Nombre de clase: {propiedades: 'valor'}}
  2. Tornado Web (Python)
    • Pros:
      • Parece ser muy potente: ¡utilizado por FriendFeed (al menos)!
      • de autenticación a través de los principales OpenID, OAuth y Facebook ya ejecutados
      • Muy ligero (podría ser un problema)
    • Contras:
        No
      • tan popular: a entender mejor el trabajo de ir en el código que el documento
      • Urls parece ser muy básico (por lo que yo veo, tienes que definir todas las URL en un archivo, con toda la clase incluida)
      • una clase por acción (que podría ser pesado)
      • decoradores para la básica (prueba si el usuario es de autenticación, etc.) debe hacerse

Para su uso en la producción, lo haría ser fácilmente posible con apache & mod_proxy o nginx.

Por lo tanto, mis preguntas son bastante simples: ¿qué elegirías (entre esos dos u otros, no estoy cerrado a las sugerencias) y por qué?

¡Muchas gracias por su consejo!

Respuesta

14

Mi marco de desarrollo de aplicaciones web RESTful favorito es Restlet. Es un framework/biblioteca Java (puede considerarse como cualquiera de los dos) pero funciona bien con Jython y JRuby, por lo que si prefiere esos idiomas, igual puede usarlo. Lo uso principalmente con Groovy.

prefiero Restlet porque:

  • su API abraza totalmente y se alinea con los paradigmas REST, por lo que le anima a trabajar REST. Por ejemplo, cuando un Router enruta una solicitud a un ServerResource, crea una nueva instancia del ServerResource para cada solicitud. Esto alienta a la implementación a ser apátrida. Y hay una jerarquía de clases ricas con todos los conceptos necesarios para implementar una aplicación web RESTful: Cliente, Servidor, Protocolo, VirtualHost, Solicitud, Respuesta, Tipo de Medios, Estado, etc.

  • Su API incluye clases para escribir tanto servidores como clientes, y son muy consistentes y casi simétricos. Por ejemplo, hay una clase ServerResource y una clase ClientResource. ServerResource.get() y ClientResource.get() ambos devuelven un Representation. La única diferencia es que implementa ServerResource.get() y genera una representación de respuesta, mientras llama al ClientResource.get() y recibe una representación de respuesta.

  • La API es coherente con las convenciones de Java. Por ejemplo, si una solicitud realizada con ClientResource.get() recibe una respuesta de error como 401, se lanzará un ResourceException. Y si está implementando un ServerResource y desea devolver un estado de error, simplemente arroje un ResourceException (que es un RuntimeException, lo cual es bueno).

  • A través de su mecanismo de extensión, funciona muy bien con una amplia gama de las mejores bibliotecas de Java.Las extensiones se incluyen para diversas bibliotecas de cliente y servidor HTTP, bases de datos, bibliotecas de plantillas, libs de seguridad, bibliotecas de datos como XML, JSON, OAuth, OData, etc., e incluso OSGI.

  • La implementación es muy flexible. Puede insertar una API potenciada por Restlet en una aplicación Java existente, una aplicación Java Servlet existente o cualquier servidor Java App App estándar (Servlet). O puede crear una aplicación de servidor independiente con un servidor HTTP incorporado como Jetty: ese es mi enfoque preferido. Y debido a que se ejecuta en la JVM, se ejecuta en casi cualquier hardware o sistema operativo.

  • Es maduro, confiable, mantenido de manera responsable, mejorando constantemente, y bien respaldado por la comunidad y comercialmente.

  • Es de código abierto, y tiene un código muy claro y bien estructurado. Los desarrolladores están felices de aceptar cualquier contribución. He enviado algunos parches y los he comprometido en el maletero rápidamente sin drama.

Otras opciones me gustaría sugerir serían la microframework Python Bottle y la microframework Rubí Sinatra. Son simples, directos, livianos y efectivos. Y debido a que trabajan con las pilas de WSGI y Rack, hay un amplio conjunto de módulos de "middleware" que se pueden usar fácilmente con ellos.

+0

Whoa! ¡Esa es una respuesta muy completa! ¡Realmente aprecio el tiempo que tardó en responderme! Echaré un vistazo a Restlet :) ¡Muchas gracias! –

+0

@ cx42net: ¡placer! ¡Por favor dejanos saber lo que piensas! (Por cierto, si te gusta mi respuesta, debes votarla.) –

+0

Me gustaría votar (lo intenté tan pronto como lo leí) pero mi perfil bajo no me permite hacerlo :( –