J'étudie la possibilité de fournir un service XML-RPC à partir d'une application ruby on rails existante. J'espère pouvoir le faire en implémentant simplement quelques méthodes de contrôleur supplémentaires et en le servant par le biais de ma configuration apache/passenger existante. Cette approche est-elle plausible, ou XML-RPC nécessitera-t-il un serveur web distinct ?
Réponse
Trop de publicités?En supposant que Rails 3 :
Il existe deux ou trois approches de base pour offrir des services XMLRPC à partir d'une application Rails.
La première consiste à utiliser l'intergiciel Rack (gem 'rack-rpc'). https://github.com/datagraph/rack-rpc ) qui supporte cela, ce qui, en théorie, devrait être possible d'exécuter sur le même serveur qu'une application existante basée sur Rack, mais j'ai trouvé l'expérience frustrante lorsque j'ai voulu travailler avec des modèles ActiveRecord. J'ai réussi à faire en sorte que rack-rpc réponde aux requêtes des clients xml-rpc en l'ajoutant à la liste des middleware dans la configuration du fichier application.rb, mais je n'ai pas pris le temps de trouver un moyen de connecter ActiveRecord.
Une alternative est d'utiliser un fork de la fonction dépréciée actionwebservice de l'époque de rails 1.x. A ce jour, j'ai trouvé un fork qui semble relativement fonctionnel sur Rails 3.0.5 :
gem 'rubyjedi-soap4r'
gem 'actionwebservice', :git => 'https://github.com/mkoentopf/actionwebservice.git'
La fonctionnalité actionwebservice a été dépréciée pour encourager les gens à utiliser les API RESTful pour exposer les services web, mais si vous avez des clients qui s'attendent à pouvoir envoyer des requêtes xmlrpc (comme une douzaine de clients de blogs populaires), vous n'aurez évidemment pas cette option.
J'ai suivi la documentation pour mettre en œuvre un ApiController qui comporte des lignes comme celle-ci :
class ApiController < ApplicationController
acts_as_web_service
web_service_dispatching_mode :layered
skip_before_filter :your_default_auth_method
web_service :metaWeblog, MetaweblogService.new(self)
web_service :blogger, BloggerService.new(self)
...
def xmlrpc
api
end
def api
dispatch_web_service_request
end
end
Ensuite, vous devez implémenter une classe Api et une classe Service. (Vous pouvez simplifier ce processus si vous n'avez pas besoin des appels de méthode de style xml-rpc "metaWeblog.methodname" ; supprimez simplement la méthode de distribution :layered et remplacez-la par l'une des alternatives expliquées dans la documentation d'actionwebservice.
Votre classe MyApi hérite de ActionWebService::API::Base et utilise des méthodes comme api_method pour spécifier les signatures de méthodes xml-rpc supportées. Votre MyService hérite de ActionWebService::Base et implémente simplement les méthodes comme du code ruby normal. Il est possible que vous deviez/voulez passer une référence à la classe ApiController que vous implémentez, ce que vous pouvez faire dans la méthode initialize du service.