2010-12-08 31 views
9

Je sais que cette question est trop vaste pour être traitée avec un simple "utiliser ce cadre", mais j'apprécierais vraiment vos conseils à ce sujet.Comment choisir le cadre RESTful parfait?

Je cherche à faire un projet (plutôt complexe) que de lancer une API. Je suis ouvert à tout langage de programmation (PHP, Python, Java principalement) et j'ai trouvé de nombreux frameworks plus orientés pour faire un serveur web RESTful. La seule contrainte majeure que j'ai est que j'aurais un paquet indépendant réutilisable, simple et non-code-spaghetti afin d'améliorer mon API facilement plus tard ou même passer à un autre framework sans douleur.

Pour Python & Java, j'ai pensé à faire un paquet dédié. Chaque action appelle la méthode dédiée dans le package, le paquet renvoie object/dict et l'action le transforme au format approprié.

Après de nombreuses recherches, je hésite entre deux cadre qui pourrait être bon pour mon travail, mais je besoin de vos conseils parce que je ne voudrais pas faire des erreurs ici.

  1. Play! Framework (Java)
    • Pros:
      • Router sont orientées RESTFul (vous définissez la méthode (GET, POST, etc.), la demande et la class.method à utiliser)
      • Vous ne devez pas faire une classe par l'action
    • Contre:
      • Le modèle est déjà inclus. Si je change plus tard le cadre, peut-être je serai coincé avec (mais apparemment pas depuis que Play! Semble utiliser JPA)
      • Peut-être le fait que si je veux envoyer des paramètres à l'action qui serait définie dans la signature de la méthode , je dois adopter les ClassName.properties au lieu d'un JSON comme {ClassName: {propriétés: 'valeur'}}
  2. Tornado Web (Python)
    • Plus:
      • Semble être très puissant: utilisé par FriendFeed (au moins)!
      • Auth via majeur OpenId, OAuth et Facebook déjà mis en œuvre
      • Très léger (peut-être un problème)
    • Moins:
      • Pas si populaire: vous comprenez mieux le travail en allant Dans le code que le doc
      • Urls semble être très basique (Autant que je l'ai vu, vous devez définir toutes les URL dans un fichier, avec toute la classe incluse)
      • une classe par l'action (qui pourrait être lourd)
      • Décorateurs pour la base (tests si l'utilisateur est auth, etc.) doit être

Pour les utiliser dans la production, il serait être facilement possible avec apache & mod_proxy ou nginx. Donc, mes questions sont assez simples: que choisiriez-vous (entre ces deux ou d'autres, je ne suis pas fermé aux suggestions) et pourquoi?

Merci beaucoup pour vos conseils!

Répondre

14

Mon framework de développement RESTful Web App préféré est Restlet. C'est un framework/library Java (on peut le considérer comme l'un ou l'autre) mais il fonctionne bien avec Jython et JRuby, donc si vous préférez ces langages, vous pouvez toujours l'utiliser. Je l'utilise surtout avec Groovy.

Je préfère Restlet parce que:

  • Son API embrasse pleinement et aligne avec les paradigmes RESTful, il vous encourage à travailler restfully. Par exemple, lorsqu'un Router achemine une demande vers un ServerResource, il crée une nouvelle instance du ServerResource pour chaque requête. Cela encourage la mise en œuvre à être apatride. Et il y a une hiérarchie de classe riche avec tous les concepts requis pour implémenter une application web RESTful: Client, Serveur, Protocole, VirtualHost, Demande, Réponse, MediaType, Statut, etc.

  • Son API comprend des classes pour écrire les deux serveurs et clients, et ils sont très constants et presque symétriques. Par exemple, il existe une classe ServerResource et une classe ClientResource. ServerResource.get() et ClientResource.get() tous deux renvoient un Representation. La seule différence est que vous implémentez ServerResource.get() et générez une représentation de réponse, pendant que vous appelez ClientResource.get() et recevez une représentation de réponse.

  • L'API est conforme aux conventions Java. Par exemple, si une demande faite avec ClientResource.get() reçoit une réponse d'erreur telle que 401, un ResourceException sera lancé. Et si vous mettez en œuvre un ServerResource et que vous voulez retourner un statut d'erreur, vous venez de lancer un ResourceException (ce qui est un RuntimeException, ce qui est bien). Par l'intermédiaire de son mécanisme d'extension, il joue très bien avec un large éventail des meilleures bibliothèques Java autour.Des extensions sont incluses pour diverses bibliothèques de client et serveur HTTP, bases de données, bibliothèques de modèles, bibliothèques de sécurité, bibliothèques de données telles que XML, JSON, OAuth, OData, etc., et même OSGI.

  • Le déploiement est très flexible. Vous pouvez intégrer une API optimisée pour le service de restauration dans une application Java existante, une application Java Servlet existante ou un serveur Java Web App (Servlet) standard. Ou vous pouvez créer une application de serveur autonome avec un serveur HTTP intégré tel que Jetty - c'est mon approche préférée. Et parce qu'il fonctionne sur la JVM, il fonctionne sur presque tous les matériels ou systèmes d'exploitation.

  • Il est mature, fiable, entretenu de façon responsable, s'améliorant régulièrement, et bien soutenu par la communauté et commercialement.

  • Il est open source et son code est très clair et bien structuré. Les développeurs sont heureux d'accepter toutes les contributions. J'ai soumis quelques patchs et je les ai engagés dans le coffre rapidement sans drame.

Autres options je proposerais serait le microframework Python et Ruby Bottle microframework Sinatra. Ils sont à la fois simples, simples, légers et efficaces. Et parce qu'ils fonctionnent avec les piles WSGI et Rack, il existe un riche ensemble de modules «middleware» qui peuvent facilement être utilisés avec eux.

+0

Whoa! C'est une réponse très complète! J'apprécie vraiment le temps que tu as pris pour me répondre! Je vais jeter un coup d'oeil à Restlet :) Merci beaucoup! –

+0

@ cx42net: mon plaisir! S'il vous plaît laissez-nous savoir ce que vous pensez! (BTW si vous aimez ma réponse, vous devriez voter.) –

+0

Je voudrais voter (j'ai essayé dès que je l'ai lu) mais mon profil bas ne me permet pas de le faire :( –