2 votes

Fournir un service XML-RPC à partir d'une application ruby on rails ?

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 ?

2voto

JasonTrue Points 13615

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X