Есть ли пример использования ActiveResource и XMLRPC для Rails?

Я видел массу примеров с ActionWebService и XMLRPC, но им уже 3 года, и, насколько я понимаю, ActiveResource должен заменить ActionWebService.

Я знаком с тем, как ActiveResource может использовать XML для «общения» с другими веб-сайтами и получения информации о модели, но XML-RPC — это совершенно другой тип вещей, в котором вы передаете имя метода, который хотите выполнить, и запрос сдается и т.

РЕДАКТИРОВАТЬ - я знаю, как должен работать ActiveResource, но у меня есть клиентское приложение, которое должно использовать XML-RPC с определенным API (MetaWeblogAPI), и у меня нет другого выбора, кроме как реализовать его - руки связаны.

Итак, в частности: я пытался найти некоторые документы или статью о том, как XML-RPC может быть реализован с помощью Rails с использованием ActiveResource. Может быть, и не может — я тоже хотел бы знать, что я полагаю. Мне просто не хватает "небольшого прыжка" - части "как передать запрос методу", где я получаю возможность извлечь имя метода из запроса XML-RPC и передать его методу. Я знаю, что слишком много думаю об этом. Ничего не могу поделать - я парень .NET :).

Я пытался «использовать то, что работает» — это означает, что я пытался реализовать ActionWebService, но кажется, что он плохо работает с Rails 2.3.5 (это то, что я установил), поскольку я продолжаю получать «Неизвестный Постоянная ошибка, указывающая на установленный ActionWebService (что наводит меня на мысль, что Rails 2.x это не нравится).

Я немного n00b, так что будьте нежны :) - Я уверен, что это, вероятно, намного проще, чем я это делаю.


person Community    schedule 27.12.2009    source источник


Ответы (2)


Это намного проще, чем вы думаете. Вам не нужно возиться с XMLRPC с Rails. Вы можете просто заставить свое приложение Rails обслуживать XML по запросу, и вы можете запрашивать XML, просто добавляя .xml к любому URL-адресу, если вы указываете своему действию, как обрабатывать запросы .xml. Вот пример действия:

def show
  @post = Post.find(:all, :conditions => { :id => params[:id] }
  respond_to do |format|
    format.html do
      # this is the default, this will be executed when requesting http://site.com/posts/1
    end
    format.xml do
      # this will be rendered when requesting http://site.com/posts/1.xml
      render :xml => @post
    end
  end
end

Таким образом, нет необходимости в причудливых вызовах XMLRPC, просто добавьте .xml к URL-адресу, и Rails будет знать, что нужно обслуживать поток XML.

Чтобы использовать это с ActiveResource, вы просто делаете что-то вроде этого

class Resource < ActiveResource::Base
  self.site = Settings.activeresource.site # 'http://localhost:3000/
  self.user = Settings.activeresource.username # Only needed if there is basic or digest authentication
  self.password = Settings.activeresource.password
end
class GenreResource < Resource
  self.element_name = 'genre'
end
class ArtistResource < Resource
  self.element_name = 'artist'
end
class AlbumResource < Resource
  self.element_name = 'album'
end)
class TrackResource < Resource
  self.element_name = 'track'
end
class AlbumshareResource < Resource
  self.element_name = 'albumshare'
end

Затем в ваших приложениях, которые работают со встроенными рельсами API, вы можете выполнять такие вызовы, как TrackResource.exists?(34) и track = TrackResource.new(:name => "Track Name"); track.save и т. д.

Вот документация по ActiveResource. Для того, чтобы ActiveResource работал, просто убедитесь, что ваше приложение Rails умеет обслуживать XML по запросу с помощью respond_to.

person Blaine Lafreniere    schedule 27.12.2009
comment
Правильно - да, я уже знаю эту часть и спасибо за код :). Однако у меня нет такой роскоши, так как я работаю с XML-RPC для MetaWeblog и не могу сказать LiveWriter и Ecto, чтобы они изменили то, как они работают. Таким образом, затруднительное положение. - person ; 28.12.2009
comment
ActiveResource говорит REST, он не играет в игру XML RPC. Для XML RPC вам потребуется клиент XML RPC. - person Blaine Lafreniere; 28.12.2009
comment
У меня есть клиент - это LiveWriter и Echo - мне нужен сервер XML-RPC (поэтому мой вопрос выше). Я копаю, что ActiveResource говорит REST... как я упоминал... - person ; 28.12.2009
comment
Ваш вопрос сбивает с толку. ActiveResource — это клиентская библиотека, из-за которой у меня создается впечатление, что вы пытаетесь получить данные с какого-то сервера. Попробуйте это: blog.multiplay.co. uk/2008/10/serving-xml-rpc-from-rails-2x - person Blaine Lafreniere; 28.12.2009

В этом случае я бы оставил свой сайт/сервис ActiveResource красивым, чистым и поддерживающим RESTful. Не путайте это с XML-RPC.

Вместо этого создайте прокси-сервис, который с одной стороны принимает XML-RPC, а с другой — транслирует запросы в ActiveResource.

Затем LiveWriter связывался с ActiveResourceProxyService через XML-RPC, а ActiveResourceProxyService отбрасывал запросы ActiveResource к веб-приложению.

Похоже, вы реализуете простой API для ведения блога, поэтому он не должен занимать слишком много кода.

person marshally    schedule 29.12.2009